Изменение области видимости Angular внутри включенного контента

Angular: Может ли кто-нибудь объяснить, почему включенный контент в директиву может обновлять только объекты в области, а не переменные непосредственно в области. Это только потому, что объект и функции имеют тип ref в javascript, и почему привязка работает в одну сторону и... почему привязка прерывается после обновления внутри включенного контента (см. примеры plunker)

-Пример Plunker – переменная в области видимости и объект в области видимости

Рабочий -образец Plunker — переменная в области видимости


person Buchholt    schedule 09.04.2016    source источник


Ответы (1)


Включенный контент также может обновлять свойства родительской области.

Включенный контент подобен любому другому контенту, поэтому, если вы следовали dot.rule, вы сможете обновить нужные свойства родительской области. Всегда следуйте dot.rule и реорганизуйте свою логику, чтобы убедиться, что все сделано в angular way.

Типы области действия директивы

Директивы в angular до версии 2.0 принимают несколько типов областей, область может быть true, которая создает новую и наследует свойства родителя; false, который не создает новую область, но наследует свойства родителя; или {}, который известен как изолированная область, это создает новую область с нулевыми свойствами, она сохраняет только объявленные вами свойства.

Односторонняя и двусторонняя привязка данных

Angular использует как одностороннюю, так и двустороннюю привязку данных. Например, двусторонняя привязка данных происходит, когда вы используете директиву ng-model, всякий раз, когда вы обновляете модель, представление будет отражать эти изменения, и наоборот. С другой стороны, при использовании интерполяции {{some.property}} происходит односторонняя привязка данных.


Двусторонняя привязка данных не должна прерываться, если вы используете dot.rule. В конце концов, именно так работает прототипическое наследование.

Ознакомьтесь с этим ручкой, чтобы проиллюстрировать все сказанное в этом ответе.

person Manuel Ro    schedule 09.04.2016
comment
Я знаю, что это работает, если я привязываюсь к объекту, например $scope.person = {name:}, но почему бы не к var, например $scope.personname =? - person Buchholt; 09.04.2016
comment
Из-за прототипического наследования. Angular основан на JavaScript, и такое поведение связано с самим JavaScript. Обычно лучше полагаться на службы, значения и константы для обработки такой общей информации между областями. - person Manuel Ro; 09.04.2016
comment
Хотя вы также можете напрямую обращаться к родительским свойствам и привязываться к ним, используя $parent.myProperty. - person Manuel Ro; 09.04.2016
comment
Я знаю, что... как сказал Кайл Симпсон: ... JavaScript не наследует, копируя ВНИЗ по цепочке, а делегирует ВВЕРХ по цепочке... - person Buchholt; 09.04.2016
comment
Кажется, что добавление области в трансклюдер разрывает цепочку - если это переменная в области видимости - ‹ событие, $parent не может помочь в этом - person Buchholt; 09.04.2016
comment
Использование $parent работает до тех пор, пока директива transclude не имеет области видимости. - person Buchholt; 09.04.2016
comment
С прицелом на функцию трансклюдера не работает - а без него работает нормально! -› изменение кода: codepen.io/buchholt/pen/zqROJj - person Buchholt; 09.04.2016
comment
Какой угловой логики мне не хватает! - person Buchholt; 09.04.2016
comment
Понятно: я должен использовать $parent.$parent, если я ввожу область видимости в директиву transclude. Чем вы, Manuelro, за ваш комментарий с $parent... заставили меня встать на путь! Обновлен с работающим образцом планкера - person Buchholt; 10.04.2016
comment
Конечно. Пожалуйста! Однако вы должны принять во внимание, что $parent не предназначен для использования таким образом. Я думаю, вы можете лучше работать с сервисами, значениями и константами, которыми могут делиться контроллеры и придерживаться принципов Angular. - person Manuel Ro; 10.04.2016