2014-12-09 3 views
3

Предположим, this.model === $scope.model.Как AngularJS проводит различие между следующими действиями?

Следующая спровоцирует дайджеста:

$scope.model.property1.property2 = true; 

, но это не будет без часов:

this.model.property1.property2 = true; 

Как AngularJS различие между этими двумя строками кода?

+1

Можете ли вы уточнить немного больше? В дайджесте обрабатывается asyncQueue по областям и перемещается по областям для повторения часов. Что вы подразумеваете под одним, вызовет дайджест, а другой - нет? Я создал скрипку, которая использует обе эти строки внутри ng-click, и оба запускают дайджест и свойство update2. http://jsfiddle.net/11j8vpL8/ – Patrick

+0

ОК, поэтому мое понимание неверно. Оба будут запускать дайджест? Должно быть, в фактическом коде были некоторые смягчающие обстоятельства. – Ben

+0

Дайджесты запускаются в угловом коде (например, ng-click запускает дайджест, вводя в ввод модели ng и т. Д.) Или из «внешнего» углового кода через область. $ Apply(). Можете ли вы предоставить код, в котором один кусок кода демонстрирует другое поведение, чем другое через jsfiddle? В моей последней скрипте интерполяция ({{model.property1.property2}}) ставит часы на это свойство, поэтому не имеет значения, обновляется ли она с помощью этого или $ scope. – Patrick

ответ

1

Я сделаю все возможное, чтобы ответить на вопрос в его нынешнем виде. Там нет ничего, что вызвало бы дайджест случиться с любым из этих линий:

$scope.model.property1.property2 = true; 
this.model.property1.property2 = true; 

Оба эти простые присваивания. Дайджесты запускаются из кода, который его явно вызывает. Обычно это происходит либо через $ scope. $ Eval(), $ scope. $ Apply() и явная $ scope. $ Digest() вызывает. Например, ng-click связывается с элементами события click и вызывает $ scope. $ Apply() с функцией, прикрепленной к этой директиве.

Цикл $ digest сначала выполняет выражения для оценки в asyncQueue области (заполненной $ scope. $ EvalAsync()). Затем он перемещается по областям и оценивает, какие часы нужно запускать, и вызывает соответствующие функции, назначенные им (если он находит изменение).

Так пару очков, чтобы забрать, которые относятся на ваш вопрос:

  • Обе эти строки не вызовет $ переваривать
  • Угловая не нужно различать две строки кода, потому что они оба являются простым назначением для одного и того же свойства (предполагая this.model === $ scope.model, как было указано в вопросе). Даже если this.model и $ scope.model были разными, это еще простое назначение, но для разных целей.
  • Часы «огонь» в цикле $ digest, когда пройдены области.

демонстрирует это с высокого уровня. Обратите внимание, что нет явных часов, наложенных на $ scope.model.property1.property2 или this.model.property1.property2. Представление обновляется, поскольку оба назначения выполняются в отдельных ng-кликах, которые запускают цикл $ digest. {{Model.property1.property2}} в представлении устанавливает часы на это значение, которое обновляется через каждый ng-щелчок, когда происходит $ digest.

Не видя пример кода, в котором происходят реальные различия, я не могу сказать, почему одни ведут себя иначе, чем другие.

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