我一直坚持在我一直在维护的大型AngularJS应用程序中构建组件,我真的很喜欢一些指导,因为我在我的智慧结束时。请耐心等待我!
上下文
我有一些指令,我希望彼此沟通。因此,我认为在每个指令中定义一个控制器以暴露API以供其他指令使用是合适的。现在,我很清楚指令中的require
属性以及如何引入父指令的控制器来使用。不幸的是,在我目前的情况下,我的指令不一定适合要求控制器的使用。
我面对的代码库主要选择直接向DOM添加指令,然后再编译它们,而不是使用require
。我想这是为了灵活地定制指令如何相互依赖。
我已经在我创建的示例Plunker中包含了来自link
函数的片段,以帮助可视化我面临的问题。注意如何将指令附加到DOM然后进行编译。我尽力尽力创建我实际工作的代码的简化版本,因为我无法发布它。
link: function(scope, elem) {
scope.data = '...';
var d2Elem = elem.find('li').eq(0);
d2Elem.attr('d2', '');
var input = angular.element('<input type="text" ng-model="data">');
elem.find('li').eq(-1).append(input);
$compile(d2Elem)(scope);
$compile(input)(scope);
// Able to get d1 directive controller
console.log(elem.controller('d1'));
// Not able to get compiled d2 directive controller
console.log(d2Elem.controller('d2'));
// Able to get compiled ng-model directive controller
console.log(input.controller('ngModel'));
}
问题:
有人可以解释为什么我看到我在Plunker中评论过的行为吗?为什么当我编译一个我定义的指令(即d2
)时,即使它存在于指令定义中,我也无法访问它的相应控制器?
巧合的是,我发现在编译内置的ng-model
指令后,我实际上可以得到它的控制器。
我正在思考的另一点:我所描述的流程是否是管理指令相互沟通的最不痛苦的方法?注意到这些指令不一定具有严格的父子关系。
非常感谢一些想法!
答案 0 :(得分:0)
由Ajax异步加载d2.html需要一段时间,直到它被完全加载你无法访问它的控制器,参见附件截图,在ajax调用之后它能够访问d2的控制器。
我试过替换
console.log(d2Elem.controller('d2'))}
与
setTimeout(function(){console.log(d2Elem.controller('d2'))},1000);
它对我有用,可能会给你一些提示或者可能会延迟解决你的问题,我知道这不是好的做法!!