Ограничить AngularJS в стиле ng

#angularjs #performance #dom #angularjs-directive #angularjs-ng-style

Вопрос:

Я вычисляю высоту контейнеров в соответствии с окном просмотра с ng-style помощью моего пользовательского метода.

Все работает хорошо, но он продолжает вызывать метод, даже если элемент стилизован. У меня есть большое количество элементов DOM, которые необходимо стилизовать. Вот почему я не могу разрешить непрерывное выполнение для всех элементов. Пожалуйста, обратите внимание, что я не могу использовать ng-class , потому что каждый элемент содержит разное содержимое. И не может использовать переменную области действия контроллера из-за неограниченного количества элементов.

HTML:

 <div class="myElement" ng-style="styleElement('myElement')">
    ...
    ...
</div>
 

Функция:

 $scope.styleElement =  function (elementCls) {
    var elementToSet = $('.' elementCls ':visible');
    if(elementToSet.length){
        var winHeight = $( window ).height();
        var eTop = elementToSet.offset().top;
        if(eTop == 0){
            var elemChilds = elementToSet;
            var elemChildsLen = elemChilds.length;
            for(var i=0;i<elemChildsLen;i  ){
                var elem = elemChilds[i];
                var r = elem.getBoundingClientRect();
                if(r.top != 0){
                    eTop = r.top;
                    i= elemChildsLen; 
                }
            }
        }
        var nScrollHeight = winHeight - eTop - 20;
        return { 
            'height': nScrollHeight   'px',
            'overflow-x': 'hidden',
            'overflow-y': 'auto'
        };
    }
};
 

Я пробовал использовать a custom directive , но привязка DOM или написание a watcher не являются предпочтительным решением для меня из-за производительности. Заранее спасибо!

Ответ №1:

Используйте однократную привязку, которая будет вызываться только styleElement один раз.

 <div class="myElement" ng-style="::styleElement('myElement')">
    ...
    ...
</div>
 

Комментарии:

1. Попробовал и получил ошибку: Error: [$parse:syntax] Syntax Error: Token ':' not a primary expression at column 1 of the expression [::styleElement('myElement')] starting at [::styleElement('myElement')] .

2. Какую версию angularjs вы используете? Это должно работать с версии 1.3.0