Во-первых, то, что вы наблюдаете, не имеет ничего общего с привязкой <
.
Проблема в том, что выражение {{hello}}
внутри обеих директив не является частью шаблона этих директив. И для таких элементов правила привязки другие.
Angular автоматически создает функции ссылок для {{hello}}
выражений. Но области, в которых оцениваются эти функции ссылок, в ваших случаях разные.
То, что вы, вероятно, ожидали, это:
rootScope
/ \
/ \
attr-dir-new-scope one-way-isoloate-scope
/ \
/ \
{{hello}} {{hello}}
Однако, согласно этому комментарию в исходном коде а>:
// Мы передаем область изоляции только в том случае, если директива изоляции имеет шаблон,
// в противном случае дочерние элементы не принадлежат директиве изоляции.
реальная картина такова:
root scope
/ \ \
/ \ \
attr-dir-new-scope \ one-way-isoloate-scope
/ \
/ \
{{hello}} {{hello}}
Итак, в вашем примере первая директива <attr-dir>
не создает изолированную область, а создает новую область, поэтому при связывании angular передает эту новую область как функции связывания вашей директивы:
link: function(scope){
scope.hello = 'attrDir';
}
и к функции связывания, созданной для выражения {{hello}}
. Вот почему, когда вы добавляете значение в функцию связывания, оно становится доступным в функции связывания выражений.
Но ваша вторая директива <one-way>
создает изолированную область, и, согласно комментарию, который я упомянул выше, функция связывания директивы получает изолированную область действия, как и должна, но функция связывания выражение получает другую область (корневую область в вашем примере). Итак, вы добавляете значение hello
в разные области. Вот почему значение не определено.
person
Max Koretskyi
schedule
11.03.2017
one way !== isolated scopes
. - person lin   schedule 11.03.2017