我有一个复合列表指令--也就是一个列表项,它本身也可以是一个列表。
父指令定义了控制器:
.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 (ing)在link函数内的一个列表项完成的:
link: function (scope, element, attrs, parentCtrl) {
...
$compile("<list></list>")(scope)
...
}
这会抛出一个异常:
找不到指令“list”所需的控制器“parent”!
原因很明显- $compile函数没有提供控制器,因此无法解决“父”的要求。
因此,我尝试手动提供控制器:
$compile("<list></list>")(scope, null, {'parent': parentCtrl});
它不会抛出异常,但仍然不会在需要时提供此控制器。
你知道如何让$compile函数接受一个也应该被评估的外部控制器吗?
发布于 2015-02-11 00:32:16
以下是解决方案,以供将来参考:
在$compile函数中,所需的控制器可以作为转换后的控制器传递:
$compile(template)(scope, undefined, {transcludeControllers: injectedCtrl})
其中"injectedCtrl“是列出指令期望的控制器的对象,例如,如果您使用require: '^dad'
,则transcludeControllers
如下所示:
transcludeControllers: {
dad: { //name of controller in 'require' statement
instance: vm //instance of controller
}
}
请参阅此示例:https://jsfiddle.net/qq4gqn6t/11/
就是这样!
发布于 2014-03-23 05:33:32
我刚刚遇到了一个类似的问题,解决方案似乎是首先将元素添加到父元素,然后编译它。
.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);
};
}
};
});
发布于 2016-04-14 17:06:35
$compile(angular.element("< list>< /list >"))(scope)
https://stackoverflow.com/questions/21854814
复制相似问题