是否有可能检索在另一个指令中编译的指令的控制器?

时间:2015-01-07 08:01:55

标签: javascript angularjs

我一直坚持在我一直在维护的大型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指令后,我实际上可以得到它的控制器。

我正在思考的另一点:我所描述的流程是否是管理指令相互沟通的最不痛苦的方法?注意到这些指令不一定具有严格的父子关系。

PLUNKER

非常感谢一些想法!

1 个答案:

答案 0 :(得分:0)

由Ajax异步加载d2.html需要一段时间,直到它被完全加载你无法访问它的控制器,参见附件截图,在ajax调用之后它能够访问d2的控制器。

enter image description here

我试过替换

console.log(d2Elem.controller('d2'))}

setTimeout(function(){console.log(d2Elem.controller('d2'))},1000);

它对我有用,可能会给你一些提示或者可能会延迟解决你的问题,我知道这不是好的做法!!

相关问题