我尝试使用$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);
});
运行时,会产生结果:
不能工作:
作品:我的标题
Here's a plunker showing it in action
我为动态创建的组件创建的范围如何作为组件的父范围传递?
关于角度为何如此行为以及可能如何避免它的任何指针都非常受欢迎。
答案 0 :(得分:5)
如我所见,您需要在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));
});