2013-12-08 2 views
2

У меня есть контроллер и директива. Директива имеет выделение области с = двухсторонней переменной с именем counter и выражением & с именем tick().Digest обновляет родительский контроллер до директивы child

Директива обновит counter и позвонит по телефону tick() сразу после.

Проблема заключается в том порядке, в котором эти операции произойдет:

  1. counter обновлена ​​в директиве
  2. tick() называется на контроллере
  3. counter обновленный контроллер

мне удалось работайте вокруг него, используя setTimeout(tick,0);, но это своего рода хак.
Другим решением было бы для tick() принять параметр (значение counter).

Есть ли лучшее решение, чем те, которые я описал выше?

ответ

2

Zen of Angular предлагает:

 
Treat scope as read only in templates 
Treat scope as write only in controllers 

Избегайте считывания значения counter в контроллере. Вместо этого передайте его как аргумент из шаблона.

setTimeout трюк - это взлом, и следует избегать полагаться на порядок выполнения различных наблюдателей в петлях $digest.

+0

Я вижу. Итак, вы говорите, что второй вариант - лучший способ справиться с этим? – Francisc

+0

Кроме того, когда вы говорите 'templates', вы имеете в виду html-файлы или директивы? – Francisc

+0

@Francisc 'templates' всегда ссылается на HTML и да, второй способ (передача параметра в качестве аргумента функции' tick') - лучший способ справиться с этим, хотя это означает, что значение должно пройти через вашу «директиву» в этом случае. –

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