什么是ng-repeat指令的"优先级"可以改变吗?

San*_*ngh 38 angularjs angularjs-directive ng-repeat angularjs-ng-repeat

Angular Documentation说: -

DOM的编译是通过调用$ compile()方法来执行的.该方法遍历DOM并匹配指令.如果找到匹配项,则将其添加到与给定DOM元素关联的指令列表中.一旦识别出给定DOM元素的所有指令,就按优先级对它们进行排序,并执行它们的compile()函数.

我认为ng-repeat指令的优先级低于自定义指令,在某些用例中,如动态id和自定义指令.角度是否允许修改指令的优先级来选择一个在另一个之前的执行?

Cuo*_* Vo 55

是的,您可以设置指令的优先级.ng-repeat优先级为1000,实际上高于自定义指令(默认优先级为0).您可以使用此编号作为指导,了解如何根据指令设置自己的优先级.

angular.module('x').directive('customPriority', function() {
    return {
        priority: 1001,
        restrict: 'E',
        compile: function () {
            return function () {...}
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

priority - 当在单个DOM元素上定义了多个指令时,有时需要指定应用指令的顺序.优先级用于在调用编译函数之前对指令进行排序.优先级定义为数字.首先编译具有更高数字优先级的指令.具有相同优先级的指令的顺序是未定义的.默认优先级为0.


Max*_*tin 11

AngularJS查找与元素关联的所有指令并对其进行处理.此选项告诉angular按优先级对指令进行排序,以便在其他指令之前编译或链接具有更高优先级的指令.拥有此选项的原因是我们可以对编译的上一个指令的输出执行条件检查.

在下面的示例中,首先添加按钮,然后才添加class到当前按钮:

演示 Fiddle

App.directive('btn', function() {
  return {
    restrict: 'A',
    priority: 1,
    link: function(scope, element, attrs) {
      element.addClass('btn');
    }
  };
});

App.directive('primary', function() {
  return {
    restrict: 'A',
    priority: 0,
    link: function(scope, element, attrs) {
      if (element.hasClass('btn')) {
        element.addClass('btn-primary');
      }
    }
  };
});
Run Code Online (Sandbox Code Playgroud)