Angularjs 什么是;要求;对象的指令定义?

Angularjs 什么是;要求;对象的指令定义?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,require-要求将另一个控制器传递到当前指令 链接功能。require采用指令控制器的名称 通过。如果找不到此类控制器,则会引发错误。名称的前缀可以是: ?-不要提出错误。这使得require依赖项是可选的 ^-也在父元素上查找控制器 以上是官方文件中的定义。这里的模糊性是什么是“指令控制器” 以美国为例 angular.module('ui.bootstrap.tabs', []) .controller('TabsController', ['$scope', '$element',

require-要求将另一个控制器传递到当前指令 链接功能。require采用指令控制器的名称 通过。如果找不到此类控制器,则会引发错误。名称的前缀可以是:

  • ?-不要提出错误。这使得require依赖项是可选的
  • ^-也在父元素上查找控制器
以上是官方文件中的定义。这里的模糊性是什么是“指令控制器”

以美国为例

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
  };
}]);

窗格
指令具有
require:“^tabs”
,其中
tabs
是其父元素上指令的名称,而附加到该指令的控制器的名称是
TabsController
。根据我自己对上述定义的解释,它应该是
require:'^TabsController'
而不是
require:'^tabs'
,这显然是错误的。请告诉我我在理解中遗漏了什么。

文档中的这个特定主题确实令人困惑,尽管看起来很奇怪,但所有这些都是有意义的

理解此定义背后逻辑的关键是理解“指令控制器”指的是指令的控制器实例,而不是控制器工厂

在选项卡示例之后,当创建
tabs
元素时,还会创建
tabscocontroller
的新实例并将其附加到该特定元素数据,如:

tabElement.data('$tabsController', tabsControllerInstance)

窗格上的
require:“^tabs”
元素基本上是对父
tabs
元素上使用的特定控制器实例(
tabsControllerInstance
)的请求。

require
参数,包括其前缀

需要另一个指令并将其控制器作为第四个参数注入链接函数。require接受要传入的指令的字符串名称(或字符串数组)。如果使用数组,则注入的参数将是按相应顺序排列的数组。如果找不到此类指令,或者该指令没有控制器,则会引发错误。名称的前缀可以是:
  • (无前缀)-在当前元素上找到所需的控制器。如果找不到,则抛出错误
  • -尝试找到所需的控制器,或将
    null
    传递到
    链接
    fn(如果找不到)
  • ^
    -通过搜索元素及其父元素找到所需的控制器。如果找不到,则抛出错误
  • ^
    -通过搜索元素的父元素来定位所需的控制器。如果找不到,则抛出错误
  • ?^
    -通过搜索元素及其父元素或过程,尝试定位所需的控制器
    null
    链接
    fn(如果未找到)
  • ?^^
    -尝试通过搜索元素的父元素或传递来定位所需的控制器
    null
    链接
    fn(如果未找到)

我同意文件令人困惑。但是,由于不可能(除非您阅读代码)知道控制器函数的名称——这是一个特定于实现的细节(可以是匿名函数)——也许他们认为这是指令的名称,这一点非常清楚。Angular的文档是整个Angular项目中最糟糕的事情。遗憾的是,这里没有提到的另一件事是,这些指令的元素必须在祖先关系中。我说的对吗?@user271996-这是一篇摘自官方文件的文章。“^-也在父元素上查找控制器。”因此,角度语法意味着它们“可以”处于父子关系中,但不是必需的。从理论上讲,您可以执行类似于
的操作,并且不会违反
require
属性(
require:“^tabs”
)的定义。但是您不想这样做,因为它无法按设计的那样工作。如果使用^^而不是^,那么它只检查父元素,跳过当前元素。Thx bmleite。你是如何找到这个话题的细节的?除了正式文档之外,您还有其他学习资源吗?此外(每个文档),您可以通过传递数组来要求多个学习资源,并且它们也将作为数组进入链接函数(第4个参数)。@Benwide:
?^
^
相同吗?这些前缀是否具有顺序意义?@URL87在当前实现中,顺序无关紧要。注意:我的测试似乎表明,使用require的多个嵌套将返回最高级别的父级控制器,而不是直接的父级控制器。这使得控制大家庭毫无用处,因为孙子总是把祖父误认为父亲。