3

У меня есть следующий код (события являются массив):нг-повтор функции контроллера вызовов слишком много раз

<tr ng-repeat="event in events"> 
    <td> 
     <span time-ago="{{event.TimestampSec}}"></span> 
    </td> 
    <td> 
     {{prepareAlertValue(event.AlertValue)}} 
    </td> 
</tr> 

времени назад - мой заказ директива. Выполняется events.length раз.

Мой контроллер:

... 
window.callPrepareAlertValueCount = 0 

$scope.prepareAlertValue = function(value) { 
    window.callPrepareAlertValueCount++; 
    if(safemineHelper.isFloat(value)) { 
     value = (~~(value * 100))/100; 
    } 
    return value; 
} 
... 

После список показал - я вижу, что callPrepareAlertValueCount растет. Журнал консоли:

> callPrepareAlertValueCount 
< 41890 
> callPrepareAlertValueCount 
< 46150 
> callPrepareAlertValueCount 
< 480315 

Пожалуйста, может кто-нибудь объяснить, почему prepareAlertValue выполняется все время. Нужно ли писать директивы для каждой функции форматирования?

+2

Возможно, я неправильно читаю, но вы говорите, что проблема в том, что он выполнен events.length раз? это не ожидаемое поведение в цикле? – aw04

+0

Выполняется несколько раз, потому что он находится внутри тега tr, который имеет ng-repeat, если вы поместите его вне tr, он будет вызываться только один раз. –

+0

Проблема в том, что функция callPrepareAlertValueCount выполняется все время. Около 3000 раз в секунду – Gleb

ответ

2

Это правильно, что когда-либо связывалось с html, оно вызывается в каждом цикле дайджеста, выполняемом угловыми js.

Используйте команду {{::prepareAlertValue(event.AlertValue)}}, чтобы выполнить эту функцию только один раз.

Note Bind Once only work for above Angular 1.3+

+0

Похоже на истину;), но я получил следующую ошибку: Ошибка синтаксиса: токен ':' не является основным выражением в столбце 1 выражения [:: prepareAlertValue (event.AlertValue)], начиная с [:: prepareAlertValue (event. AlertValue)]. – Gleb

+0

какая версия углового вы используете? –

+0

AngularJS v1.2.16 – Gleb

1

Угловая не знает, что происходит внутри prepareAlertValue() так он должен вызывать эту функцию на каждом переваривать

+0

Так что мне нужно написать директиву для значения формата? – Gleb

+1

@pankajparkar имеет интересный подход – goreorto

0

callPrepareAlertValueCount является глобальной переменной в окне, и обновляется всякий раз, когда prepareAlertValue функция вызывается.

Улов, это называется всякий раз, когда происходит цикл дайджест. Всякий раз, когда происходит изменение, например, событие щелчка запускается (через Angular с ng-click), или изменяется ваш массив events, который запускает цикл $ digest. Когда запускается $ digest, функция переоценивается по мере переоценки всех угловых наблюдателей и увеличивается callPrepareAlertValueCount. Так бывает гораздо чаще, чем events.length.

В принципе, вы не должны полагаться на поддержание счетчика таким образом, так как у вас нет контроля над тем, сколько раз выполняются циклы $ digest.

Вот простой Fiddle, который демонстрирует это.

+0

Если я удалю инкремент для callPrepareAlertValueCount и вместо этого напишу console.log ('здесь'), он вызовет около 3000 за секунды. Поэтому я уверен, что проблема не связана с callPrepareAlertValueCount. (Когда я пишу консоль.log ('here') мой компьютер зависает) – Gleb

+0

@Gleb Точно моя точка ... Функция вызывается много раз, а ваш счетчик не имеет значения. –

-1

Вы можете перестать вызывать функции контроллера внутри ng-repeat. или если вы хотите вызвать функцию контроллера внутри цикла (ng-repeat), тогда используйте правильные условия (в вашем контроллере), если true, то вызовите функцию, если вы этого не сделаете, тогда она будет вызывать функцию контроллера каждый раз ,

+0

Я думаю, вы можете прочитать о углеродном цикле дайджест https://www.ng-book.com/p/The-Digest-Loop-and-apply/ –

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