在组件上使用$ compile时,为什么范围是通过$ parent传递的?

时间:2017-05-30 12:35:02

标签: angularjs angularjs-components angularjs-compile

我尝试使用$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

问题

我为动态创建的组件创建的范围如何作为组件的父范围传递?

关于角度为何如此行为以及可能如何避免它的任何指针都非常受欢迎。

1 个答案:

答案 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)); 
});