Why angular define & ldquo; Priority & rdquo; Property for directives defined on the same DOM element?


I've found that angular doesn't take advantage of order the directives are defined in, instead it uses static priority field. It does not suite well for all cases.


<div ng-if="items.length < 50" ng-repeat="item in items"></div>

<div ng-repeat="item in items" ng-if="items.length > 50"></div>

These two lines of code can have different meaning.

Case 1) check if amount of items less than 50, ng-repeat 10000 items

Case 2) ng-repeat 10000 items, then on each element check if amount of items is less than 50

If ng-if had higher priority the first line of code would allow obviously very important optimization...

Obviously there is not much reason for using static "priority" field compared to prioritizing directives with order they are defined in, so my question is:

What steps should be taken to approve this idea and have it implemented?

(I was never looking into angularjs source code, some external help is required to point-out the places that need to be changed in order for providing the subject approach, I would be thankful for any external help in this direction)

Thank you in advance!


Here's a jsFiddle showing that ng-if is getting executed 20000 times for an array of 10000 items, each ng-if creates a scope which doubles the problem...


I can't find a reason on why angular doesn't take advantage of order the directives are defined in, rather than using static priority field, it does not suite well for all cases.

The idea of angular directives is to extend browser built-in markup languages (tags, attributes, ...). I believe there is no such feature in standard browser markup. I want to stress that directives in angular is declarative programming.

For the problem you pointed out, it looks to me like imperative programming. It's like you're coding your logic in the page with an if and a loop. But in your case, it does not make much sense to use them on the same element => it's very similar to writing if and for loop on the same line in any imperative programming languages (c++, c#, java,...). It makes more sense to write it like this if you follow imperative programming mindset:

<div ng-if="items.length > 50">
    <div ng-repeat="item in items"></div>

I agree that sometimes in order to write UI rendering code, we have to write a bit like imperative programming but it could be kept to the bare minimum. Even in those case, if you follow the mindset of imperative programming (like the one I pointed out), there should not be a problem.

Therefore, the problem you pointed could be a problem but actually not a big problem compared to the advantages that we gain from declarative markups.

Declarative programming and imperative programming has their own pros and cons:

For the case of directives to extend "markup", it makes more sense with declarative programming which is the way angular directives were designed (markup is really declarative)

The point of declarative programming is about telling "what" you want, not "how" to do it. That comes with the benefit: it's simpler and easier to understand.


In fact, the ease of understanding code—even in an unfamiliar context—is one of the principal benefits of a declarative style.

The most notable benefit of declarative programming is that programs specify “what” we want to get as the result rather than “how”. As a result, it is more important to understand the domain that we’re working with than every detail of the language.

With your suggestion, it's more about "how" you want to get a task done. The downside of your suggestion is that when we use directives, we need to understand how they work "internally".

For example: when you use many directives on the same element, the person who uses the directives need to understand what is the order to put the directives (that's should be the concern of the person who implements the directives). That's something declarative programming tries to avoid because it's complex for users of the directives