2015-12-18 2 views
1

Читаю http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/

директиву функции связи:

element.bind('click', function() { 
    scope.foo++; 
    scope.bar++; 

    scope.$apply(); 
}); 

лучший способ для использования $ применяются:

element.bind('click', function() { 
    scope.$apply(function(){ 
    scope.foo++; 
    scope.bar++; 
    }); 
}); 

В чем разница? Разница в том, что в первой версии мы обновляем значения вне углового контекста, поэтому, если это вызывает ошибку, Angular никогда не узнает. Очевидно, что в этом крошечном примере игрушек это не будет иметь большого значения, но представьте, что у нас есть окно предупреждения, показывающее ошибки для наших пользователей, и у нас есть сторонняя библиотека, которая выполняет сетевой вызов, и она терпит неудачу. Если мы не будем обертывать его внутри $ apply, Angular никогда не узнает о сбое, и поле предупреждения не будет там.

Путаница: Почему угловая необходимость знать об ошибке, мне просто нужно показать ее пользователям. например, есть запрос ajax в ссылке fn директивы, мне просто нужно сказать, что произошло, если не удалось.

+1

Оба одинаковы. Однако различие заключается в том, что 'fn' будет запускать цикл дайджеста, выполнив эту функцию. а другой будет запускать цикл дайджеста после выполнения инструкции. Но вместо этого я предпочел бы перейти на '$ timeout (function() {})' или '$ scope. $ applyAsync', который является самым безопасным способом применять цикл дайджеста –

+0

Я знаю, что вы имеете в виду. Хорошо, я думаю, что автор может попросить запустить сетевой вызов в $ apply. – dylan

ответ

0

Область TAngular $ имеет функцию $ apply(), которая принимает функцию в качестве аргумента. AngularJS говорит, что он будет знать о мутации модели только в том случае, если эта мутация выполняется внутри $ apply(). Поэтому вам просто нужно поместить код, который изменяет модели внутри функции и вызывать $ scope.apply(), передавая эту функцию в качестве аргумента. После того, как вызов функции $ apply() заканчивается, AngularJS знает, что могут произойти некоторые изменения модели. Затем он запускает цикл дайджеста, вызывая другую функцию - $ rootScope. $ Digest() - которая распространяется на все дочерние области. В цикле дайджеста вызывается наблюдатели, чтобы проверить, изменилось ли значение модели. если значение изменилось, то вызывающая функция затем вызывается. Теперь слушателю нравится, как он обрабатывает изменения модели.

Ajax вызов через Angular buildin $ http код мутации модели неявно завернут с вызовом $ apply(), поэтому вам не нужны никакие дополнительные шаги.

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