AngularJS - 具有相同名称但在不同模块中的两个指令的预期行为是什么?

时间:2015-10-23 19:05:46

标签: angularjs angularjs-directive

当然,我可以自己检查一下。 这是更具概念性/架构性的问题以及它为何如此构建。

angular.module('appmodule1').directive('mydir', function(){});

angular.module('appmodule2').directive('mydir', function(){});

那么我们应该期待mydir

UPD : 模块之间的依赖关系:

angular.module('app',['appmodule1', 'appmodule2'])

angular.module('appmodule1', ['appmodule2']);

2 个答案:

答案 0 :(得分:1)

一件简单的事情是,如果您的模块仅直接/间接加载模块中的一个,那么将仅使用该指令工厂。但是,如果您的问题是如果两个模块都加载了,例如angular.module('app',['appmodule1', 'appmodule2']),并且您的应用程序使用模块app进行自举,那么指令工厂将被添加到一起,即指令工厂是附加的,并且这样的组件使用时将与两个工厂一起呈现。



angular.module('app1', []).directive('mydir', function() {
  return {
    restrict: 'E',
    link: function() {
      console.log("App1");
    }
  }
});

angular.module('app2', []).directive('mydir', function() {
  return {
    restrict: 'E',
    link: function() {
      console.log("App2");
    }
  }
});;
angular.module('app', ['app1', 'app2']).config(function($provide) {
  $provide.decorator('ngRequiredDirective', function($delegate) {
    console.log($delegate); //Check the console on the configuration you will see array of 2 configurations
    return $delegate;
  })
});;

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
<div ng-app="app">
  <mydir></mydir>
  <test ng-required="true"></test>
</div>
&#13;
&#13;
&#13;

通常,两者都不能指定范围,模板等(规则与元素具有多个指令时相同),并且这些指令通常在同一模块中定义(或即使在不同的模块中)也有意图和特殊目的。例如,angular内部有一个带有选择器select的指令,该指令与ng-options指令一起使用,现在在您的应用程序中要说明要将所有select转换为引导选择选项或使用ng重复的材料选择。您可以使用选择器select抽象出仍然创建另一个指令,并添加您的逻辑以通过解析ng-options表达式并呈现新的下拉列表来呈现它。

一个例子是角度本身,ng-required和其他类似指令的实现方式see this answer for example。您可以通过执行ng-required指令工厂的控制台日志来查看它。

.config(function($provide) {
  $provide.decorator('ngRequiredDirective', function($delegate) {
    console.log($delegate); //Check the console on the configuration you will see array of 2 configurations
    return $delegate;
  })
});
  

为什么要建造?

通过赌注将是可扩展性并在不同的工厂中划分不同的责任。

所以简而言之,如果你有同一个选择器的多个指令工厂,它不应该是偶然的,而是有明确的目的创建,否则它可能会变成一场灾难!

答案 1 :(得分:0)

它将取决于实例化指令的模块。如果您在appmodule1下,将使用相应的指令。这里不会有冲突,除非我遗漏了什么。