2016-10-21 5 views
0

Каковы последствия работы функции в выражении с угловым выражением? Например:Угловые характеристики с функциональным выражением

<button ng-if="isValid()">Valid</button> 

Я принимаю функцию IsValid() в настоящее время выполнения для каждого переварить петли, которые происходят много раз в секунду. Какие опции доступны в Angular для улучшения производительности здесь?

Одной из идей было бы запустить isValid() в течение таймаута несколько раз в секунду, а затем установить переменную области видимости, чтобы я мог контролировать скорость «дайджест». Существуют ли другие варианты, которые люди используют?

+0

Использование функции при привязке не является хорошей идеей, но иногда это может быть необходимо. В любом случае, как выглядит 'isValid()'? Можешь показать? –

+0

isValid - это функция, которая возвращает true или false, и выполняет довольно много работы - перебирает внутреннюю структуру и вызывает множество функций. –

+0

Что должна делать кнопка при нажатии? –

ответ

1

Я думаю, что если тело функции только простая логика сравнения, не будет влиять на производительность, но если он становится сложным, вы можете попробовать профилирование кода с помощью хромированных инструментов, чтобы узнать, сколько выполняет,

Другой вариант вы также можете попробовать привязать ng-if к свойству scope контроллера и изменить значение из другой части кода вашего контроллера, так что, возможно, вы можете применить метод отладки (https://github.com/shahata/angular-debounce), чтобы избежать установки переменной объема тонн раз

+0

Я сказал в комментариях, что это сложная функция. Debounce - интересная идея, я буду читать об этом сейчас. –

1

Похоже, вы проверяете, действительна ли форма перед отправкой. Прежде всего, ваш ng-if на кнопке поражает цель использования одной и той же функции для условного применения класса, поскольку он даже не будет в DOM, если isValid() возвращает false.

Вы должны уметь использовать ng-pattern, ng-change крючки на входах, чтобы определить срок действия, так как пользователь вводит значения формы. Затем на кнопке вы можете применить класс, основанный на справедливости формы в:

<button ng-class="{ 
     'btn-success': myFormName.$valid, 
     'btn-danger': !myFormName.$valid 
    }" ng-bind="(myFormName.$valid) ? 'Valid' : 'Invalid'"></button> 

Если вы хотите запретить отправку формы, вы можете проверить правильность формы внутри функции с ng-submit на <form> тэге:

<form name="myFormName" ng-submit="myFormName.$valid && mySubmitFunction()"> 
+0

На самом деле это не вопрос моего вопроса. Я спрашиваю о производительности функции и о том, какие опции доступны. Вы все повесили на все, что лишнее, на реальный вопрос. –

+0

Я просто пытаюсь указать, что вы должны проверять правильность ввода на основе ввода, а не на каждом дайджесте. – inorganik

+0

Хорошо, +1 inorganik, но я действительно не хочу ничего говорить о том, что меняет результаты isValid() (например, изменения происходят из разных источников, таких как срабатывание таймерных функций, наблюдателей и т. Д., А не только ввод данных - что было бы более простым делом) –

0

Один из способов - запустить функцию isValid в пределах функции интервалов, установив в нее простую переменную области. Например:

$interval(function() { 
    scope.isvalid = scope.isValid(); 
}, 100); 

Это будет работать каждые 100 мс, но, вероятно, предпочтительнее количество вызовов, которые делает дайджест. Вы также можете использовать $ watch или $ observ для уменьшения количества вызовов.

Смежные вопросы