我需要在main指令中从另一个指令的控制器中获取一个属性,这很简单:
return {
...
require['myOtherController'],
link: function(scope,element,attrs,controller){
scope.propFromOtherCtrl = controller[0].propFromOtherCtrl;
}
但是:我的指令的控制器首先被加载。
所以首先,在链接函数执行之前,propFromOtherCtrl
在控制器中是未定义的。
现在,我$scope.$watch
我的控制器中的属性,直到它被定义,然后手动启动控制器的初始化。
//directive controller
$scope.$watch(function(){return $scope.propFromOtherCtrl; },function(n,o){
if(n !== o){
// init
}
});
但这似乎相当黑客。有更优雅的方式吗? 由于我的应用程序的架构,我无法直接在两个指令之间共享范围。
答案 0 :(得分:1)
如果体系结构是您无法在两个控制器之间共享范围的唯一原因,您可以始终使用$ controller从另一个控制器继承一个控制器,那么无论html dom中的位置如何,您都可以访问其范围:
$controller('myOtherController', { $scope: $scope });
另一种方法是将触发指令的html部分插入到ng中 - 如果在其他控制器准备就绪之前没有初始化:
ng-if="propFromOtherCtrlLoaded"
最后,如果这些都不适合你,使用$ watch并不是那么糟糕,除了一小部分,停止听取更改,会提高效率:
var unreg = $scope.$watch(function(){return $scope.propFromOtherCtrl; },function(n,o){
if(n !== o){
// init
unreg();
}
});