Изолированная область с простой вложенной директивой angularjs

Пожалуйста, проверьте этот plnkr

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

Директива, созданная мной, работает отлично, если она не вложена в другую директиву.

При вложенности атрибуты 'localFunc: "& func" ' привязаны к области внешнего контроллера просто отлично, но область "localAttr:" = attr "'не работает.

Я был бы так благодарен, кто-нибудь может помочь мне понять, почему.

Ответы

Ответ 1

Изобразительно, вот как выглядят ваши области, прежде чем вводить в текстовое поле: scopes

Обратите внимание, что изолировать область 006 parent - это transcluded scope, созданная директивой container. Таким образом, searchText в области 006 будет привязываться к базе данных 005 (а не к области 003), поскольку используется примитив.

Если мы введем 11 в первое текстовое поле и 22 во второе текстовое поле и снова рассмотрим области, мы увидим, где произошло привязку данных:

enter image description here

searchforThis2 окрашен в желтый цвет в области 005, чтобы указать, что было создано новое свойство. Это произошло из-за того, что используется примитив - область 005 не использует здесь прототипальное наследование, она просто создает новое свойство примитива для себя (т.е. Оно не выглядит в области 003 для имени свойства). Другие желтые элементы указывают на изменение примитивных значений.

Как вы уже выяснили, решением "наилучшей практики" этой проблемы является привязка к свойствам объекта (а не примитивам) в родительской области (то есть области 003).

Используя в контроллере следующее:

$scope.obj = {searchforThis1: "Sample Text 1", searchforThis2: "Sample Text 2"};

и в вашем HTML:

<search searchtext="obj.searchforThis1"...>
...
<div container>
  <search searchtext="obj.searchforThis2"...>

Теперь области видимости выглядят следующим образом: enter image description here

Если мы введем 11 в первое текстовое поле и 22 во второе текстовое поле и снова рассмотрим области, мы увидим, где произошло привязку данных:

enter image description here

Поскольку область 006 является областью выделения, она использует свой $parent для доступа к области 005 (например, выше). Оттуда, однако, прототипное наследование находится в игре, поскольку мы не используем примитивы. Свойство объекта searchforThis2 находится в области 003.

Ответ 2

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

Благодаря это очень освещающее сообщение Я узнал, что моя проблема настолько распространена, что решение даже имеет имя - "Правило точки".

В основном вам нужно ссылаться на унаследованный объект на контроллере, а не на свойство, и проблема исчезает.