什么是“需要”指令定义对象的需要?(What does “require” of directive

2019-07-20 01:30发布

要求 - 要求另一控制器传递到当前指令链接功能。 在需要采取指令控制器的名字来传递。如果能找到这样的控制器将引发一个错误。 该名称可以与前缀:

  • ? - 不产生错误。 这使得需要依赖可选。
  • ^ - 查找在父元素控制器为好。

以上是从官方文档的定义。 这里的不确定性是到底什么是“指令控制器”。

就拿标签指令从angularjs的UI引导项目 ,作为一个例子。

angular.module('ui.bootstrap.tabs', [])
.controller('TabsController', ['$scope', '$element', function($scope, $element) {
  ... // omitted for simplicity
}])
.directive('tabs', function() {
  return {
    restrict: 'EA',
    transclude: true,
    scope: {},
    controller: 'TabsController',
    templateUrl: 'template/tabs/tabs.html',
    replace: true
  };
})
.directive('pane', ['$parse', function($parse) {
  return {
    require: '^tabs',
    restrict: 'EA',
    transclude: true,
    scope:{
      heading:'@'
    },
    link: function(scope, element, attrs, tabsCtrl) {
      ... // omitted for simplicity
    },
    templateUrl: 'template/tabs/pane.html',
    replace: true
  };
}]);

pane指令有require: '^tabs' ,其中tabs是它的父元素上的指令的名称,而附接到该指令的控制器的名称是TabsController 。 从我自己的上述定义的解释,它应该是require: '^TabsController'require: '^tabs' ,这就是明显的错误。 请告诉我我在我的理解缺失。

Answer 1:

文档的这一特定主题确实是混乱的,但奇怪,因为它似乎是这一切是有道理的。

关键要理解这个定义背后的逻辑是要明白“指令控制”是指指令的控制器实例 ,而不是一个控制器工厂。

继标签例如,当tabs被创建的元素,在一个新的实例TabsController还创建并连接到特定元素的数据,是这样的:

tabElement.data('$tabsController', tabsControllerInstance)

require: '^tabs'上的pane元件基本上是针对该特定控制器实例(一请求tabsControllerInstance )母体上使用tabs元件。



Answer 2:

require的参数,包括它的前缀, 是记录在上$compile API参考页 。

需要另一个指令和注入它的控制器作为第四个参数的链接功能。 在需要采用一个字符串名称(或字符串数​​组)的指令(或多个)的传递中,如果使用一个阵列,所述注入的参数将是在相应的顺序数组。 如果可以找到这样的指令,或指令不具有控制,那么将引发一个错误。 该名称可以与前缀:

  • (无前缀) - 找到当前元素所要求的控制器。 抛出一个错误,如果没有找到。
  • ? -尝试找到所需要的控制器或通过nulllink FN如果没有找到。
  • ^ -通过搜索元素及其家长找到所需的控制器。 抛出一个错误,如果没有找到。
  • ^^ -通过搜索元素的父母找到所需的控制器。 抛出一个错误,如果没有找到。
  • ?^ -尝试通过搜索元素及其家长找到所需要的控制器或通过nulllink FN如果没有找到。
  • ?^^ -尝试通过搜索元素的父母找到所需要的控制器,或通过nulllink FN如果没有找到。


文章来源: What does “require” of directive definition object take?