【发布时间】:2014-05-14 06:59:43
【问题描述】:
我对 AngularJS 处理指令的嵌入范围的方式有疑问。众所周知,transclude 的范围是其指令范围的兄弟,而不是子范围。 Shown here
但是,我有一个子指令的情况:
<div price-chart>
<div volume-indicator></div>
</div>
priceChart 指令有一个transclude: true, template: "<div ng-transclude></div>",但(transcluded)volumeIndicator 要求父级是priceChart,而不是兄弟级。
function VolumeIndicatorDirective() {
return {
restrict: "EA",
controller: "VolumeIndicatorController",
require: ["^priceChart", "volumeIndicator"],
compile: function compile(element, attrs, transclude) {
return {
pre: function preLink($scope, element, attrs, controllers) {
var priceChart = controllers[0];
var volumeIndicator = controllers[1];
priceChart.addIndicator(volumeIndicator);
},
post: angular.noop
};
}
};
}
如果 Angular 有一个可以解决问题的控制器的兄弟选择器:
require: ["+priceChart", "volumeIndicator"],
但是,这不存在,我该怎么办?
根据 zeroflagL 的评论,我尝试使用 element.parent().controller() 访问指令控制器,但它似乎专门获得了最近的 ng-controller 并跳过了指令控制器。
【问题讨论】:
-
来自文档:“通过搜索 ELEMENT 的父级找到所需的控制器”- 范围无关紧要。
-
感谢您的评论。我试过了,它似乎跳过了指令控制器并获得了最近的父级
ng-controller。尝试了 element.controller() 和每个可能的父级(parent()、parent().parent() 等)。更新OP -
我的意思是你的代码应该可以工作。你得到什么错误?至于
element.parent().controller()- 它必须是element.parent().controller('priceChart')。
标签: angularjs angularjs-directive angularjs-scope