使用所需控制器进行Angular $编译

时间:2014-02-18 13:08:18

标签: angularjs angularjs-directive angularjs-compile

我有一个复合列表指令 - 即 - 一个列表项,可以自己列出。
parent指令定义控制器:

.directive('parent', function() {
    controller: function($scope) {
    },
    link: function (scope, element, attrs) {
    }
})

列表(项目)需要父控制器,它本身可以正常工作(为什么不应该......):

.directive('list', function() {
     require: '^parent',
     link: function (scope, element, attrs, parentCtrl) {
     }
  })

具体项目也是如此,这也很好:

.directive('item', function() {
    require: '^parent',
    link: function (scope, element, attrs, parentCtrl) {
    }
})

项目可以是复合项目,在这种情况下,它自己创建“列表”。此组合由 $ compile (链接)函数内的列表项完成:

link: function (scope, element, attrs, parentCtrl) {
      ...
      $compile("<list></list>")(scope)
      ... 
}

引发异常:
指令'list'所需的控制器'parent'无法找到!
原因很明显 - $ compile函数没有提供控制器,因此无法解析'parent'的要求。
所以我尝试手动提供控制器:

$compile("<list></list>")(scope, null, {'parent': parentCtrl});

哪个不会引发异常,但在需要时仍然不提供此控制器。

任何想法如何使$ compile函数接受一个应该评估的外部控制器?

3 个答案:

答案 0 :(得分:23)

我刚刚遇到了类似的问题,解决方案似乎是首先将元素添加到父级,然后编译它。

.directive('item', function($compile) {
  return {
    template:'<li><a ng-click="addSubList()">Create Another List</a></li>',
    require: '^parent',
    replace: true,
    link: function(scope, element, attrs, parentCtrl) {

      scope.addSubList = function() {
        var sublist = angular.element('<ul list>');
        element.find('a').append(sublist);
        $compile(sublist)(scope);
      };

    }
  };
});

请参阅此Plunker:http://plnkr.co/edit/dASASrFbtXSMCRZKRAj5?p=preview

答案 1 :(得分:9)

供将来参考,以下是解决方案:

在$ compile函数中,所需的控制器可以作为被转换的控制器传递:

$compile(template)(scope, undefined, {transcludeControllers: injectedCtrl})

其中“injectCtrl”是列出指令所期望的控制器的对象,例如,如果你require: '^dad',则transcludeControllers看起来像这样:

 transcludeControllers: {
        dad: { //name of controller in 'require' statement
          instance: vm //instance of controller
        }
      }

请参阅此示例:https://jsfiddle.net/qq4gqn6t/11/

这就是它!

答案 2 :(得分:-3)

$compile(angular.element("< list>< /list >"))(scope)