在组件上使用 $compile 时,为什么作用域通过 $parent 传递?
When using $compile on component, why is the scope passed through $parent?
我正在尝试使用 $compile
动态编译一个 Angular 组件,但是范围没有传递到组件范围,而是传递到 $parent 范围。
这是一个绑定到 myTitle
属性并呈现它的简单组件:
app.component('myComponent', {
bindings: {
myTitle: '<'
},
template: `
<div>
<div>Doesn't work: {{ $ctrl.myTitle}}</div>
<div>Works: {{ $parent.$ctrl.myTitle}}</div>
</div>`
});
然后在控制器(或指令等)中我使用 $compile:
编译它
app.controller('MainCtrl', function($scope, $element, $compile) {
var template = '<my-component></my-component>';
var bindings = {
myTitle: 'My Title'
}
var scope = angular.extend($scope.$new(true), {
$ctrl: bindings
});
var newElement = $compile(template)(scope);
$element.append(newElement);
});
当运行这样时,它产生结果:
Doesn't work:
Works: My Title
Here's a plunker showing it in action
问题
我为动态创建的组件创建的范围如何作为组件的父范围传递?
任何关于为什么 angular 行为如此以及可能如何避免它的指示都非常受欢迎。
据我所知,您需要在此处传递绑定 var template = '<my-component></my-component>';
var template = '<my-component my-title="$ctrl.myTitle"></my-component>';
完整的组件可能是这样的:
app.controller('MainCtrl', function($scope, $element, $compile) {
var template = '<my-component my-title="$ctrl.myTitle"></my-component>';
$scope.$ctrl = {myTitle: 'My Title'};
$element.append($compile(template)($scope));
});
我正在尝试使用 $compile
动态编译一个 Angular 组件,但是范围没有传递到组件范围,而是传递到 $parent 范围。
这是一个绑定到 myTitle
属性并呈现它的简单组件:
app.component('myComponent', {
bindings: {
myTitle: '<'
},
template: `
<div>
<div>Doesn't work: {{ $ctrl.myTitle}}</div>
<div>Works: {{ $parent.$ctrl.myTitle}}</div>
</div>`
});
然后在控制器(或指令等)中我使用 $compile:
编译它app.controller('MainCtrl', function($scope, $element, $compile) {
var template = '<my-component></my-component>';
var bindings = {
myTitle: 'My Title'
}
var scope = angular.extend($scope.$new(true), {
$ctrl: bindings
});
var newElement = $compile(template)(scope);
$element.append(newElement);
});
当运行这样时,它产生结果:
Doesn't work:
Works: My Title
Here's a plunker showing it in action
问题
我为动态创建的组件创建的范围如何作为组件的父范围传递?
任何关于为什么 angular 行为如此以及可能如何避免它的指示都非常受欢迎。
据我所知,您需要在此处传递绑定 var template = '<my-component></my-component>';
var template = '<my-component my-title="$ctrl.myTitle"></my-component>';
完整的组件可能是这样的:
app.controller('MainCtrl', function($scope, $element, $compile) {
var template = '<my-component my-title="$ctrl.myTitle"></my-component>';
$scope.$ctrl = {myTitle: 'My Title'};
$element.append($compile(template)($scope));
});