【发布时间】:2017-06-28 20:25:33
【问题描述】:
我试图了解下面代码中到底发生了什么。
我采用了两个名为 widget 和 filter 的指令(我们可以说是兄弟姐妹)。
对于这两者,我将 controllerAs 引用为“vm”,然后它不起作用。
- 这意味着只有一个 controllerAs 引用暴露给 DOM (这里小部件控制器作为参考暴露。我不知道为什么?)
如果我将其中任何一个控制器更改为对其他内容的引用,那么它可以正常工作。
- 两个 controllerAs 引用都向 DOM 公开以获得预期结果。
你能用角度解释一下这个功能吗? 当我们为指令提供相同的控制器作为参考时,角度如何评估(这里是兄弟姐妹)。
如果有歧义? 由于每个控制器都有自己的范围,那么它会如何模棱两可?
这是我的指令结构。
<div ng-app="myApp">
{{tt.name}}
<body-dir>
<icon-dir>
<filter-dir>
</filter-dir>
</icon-dir>
<widget-dir>
</widget-dir>
</body-dir>
</div>
JS:
var myApp = angular.module('myApp', []);
myApp.controller('filterController', function filterController($scope) {
var vm = this;
vm.test = "From filter controller";
alert("filter");
});
myApp.controller('widgetController', ['$scope', function widgetController($scope) {
var vm = this;
vm.widget = "From widget controller";
alert("widget");
}])
myApp.directive('bodyDir', function() {
return {
restrict: 'E',
link: function($scope) {
alert('body-dir');
}
};
});
myApp.directive('widgetDir', function() {
return {
restrict: 'E',
controller: 'widgetController',
controllerAs: 'vm',
template: "<span>{{vm.widget}}</span>",
link: function($scope) {
alert('widget-dir');
}
};
});
myApp.directive('filterDir', function() {
return {
controller: 'filterController',
controllerAs: 'vm', // If I change something else it's working fine
restrict: 'E',
template: "<span>{{vm.test}}</span>",
link: function($scope) {
alert('filter-dir');
}
};
});
myApp.directive('iconDir', function() {
return {
restrict: 'E',
link: function($scope) {
alert('icon-dir');
}
};
});
【问题讨论】:
-
你应该隔离至少一个(2个指令中的)范围,通过添加返回的对象范围:{}或范围:{/*你想要的内部(指令)从父控制器访问的范围 */ }
-
我尝试为 body 指令启用隔离范围,但这并没有解决问题
-
我的意思是兄弟姐妹指令:)
标签: angularjs angularjs-directive angularjs-scope