2012-08-17 22 views
5

所以我刚开始使用AngularJS,除了一个小小的障碍之外,它看起来非常好。比方说,我有两个指令,其中一个需要其他的,像这样:AngularJS:templateUrl推迟控制器的构建,依赖代码中断

<outer> 
    <inner></inner> 
</outer> 

如果inner.htmlouter.html负载,那么有没有:

angular.module('components', []) 
    .directive('outer', function() { 
     return { 
      restrict: 'E', 
      replace: true, 
      transclude: true, 
      scope: {}, 
      link: function(scope) { ... }, 
      controller: function($scope) { ... }, 
      templateUrl: 'outer.html' // Note this 
     }; 
    }) 
    .directive('inner', function() { 
     return { 
      require: '^outer', // And this 
      restrict: 'E', 
      ... 
      link: function(scope, element, attrs, outerCtrl) { ... }, 
      templateUrl: 'inner.html' 
     }; 
    }); 

在HTML像这样用问题。<outer>被正确转换,并被分配一个范围和一个控制器,并且<inner>收到该控制器就好了。

如果模板负载以相反的顺序,然而<inner>已创建<outer>的控制器之前被链接,并且它失败,错误消息‘错误:没有控制器:外’

我已经尝试将服务器端负载延迟附加到inner.html,只要首先加载outer.html,任何地方都没有问题。同样,如果我内嵌outer的模板(即使用template而不是templateUrl),那么该模板将首先变得可用,并且这一切都非常出色。

有谁知道使用templateUrl的方法是否需要其他指令?在我的实际代码中,至关重要的是内部指令可以访问外部控制器,并且宁愿templateUrl而不是template,因为前者将布局与行为分开,并且即使在行为之后也可以更容易地配置模板代码已经变大了。

在此先感谢,并对不起,如果这已经问过;我无法在Stack Overflow上找到任何等效的问题。

回答

2

当您在同一个模块中定义多个指令时,您可以指定一个优先级来处理指令的执行顺序。在你的情况下,给予'外'优先的内在。因此,无论何时载入模板,指令都按顺序执行。

查看directive中的'指令定义对象'以获取更多解释。

我希望有答案。

但是,当您说'外部'控制器取决于'内部'控制器时,它看起来不太好。我个人认为,控制器不应该与其他控制器捆绑在一起。我不确定你的用例,但是应该有办法打破两个控制器之间的依赖关系。

+0

我有这个确切的问题,但没有调整优先级帮助(不在1.0.5上,而不是在1.0.7上)。在我的情况下,这是'内在'取决于'外部'的控制器,并且没有简单的方法来打破这种依赖关系,因为我有几个'内在',做一些事情需要一些东西发生在别人身上(这是一种高级手风琴) 。 – ivarni 2013-08-09 12:21:59