Сочетание ng-repeat и директивы запрещает включенному контенту доступ к внешней области?

Сценарий

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

Существующее решение

В настоящее время я управляю добавлением и удалением элементов с помощью одного обработчика щелчков делегата для каждого списка, которым управляет контроллер, в нарушение хорошего стиля AngularJS. Я хочу поместить эту логику в пользовательскую директиву. Кроме того, на каждом элементе есть некоторый каркас (например, кнопки плюс и минус), который может быть скрыт внутри шаблона директивы.

Конкретная проблема

При использовании пользовательской директивы в сочетании с ng-repeat, transcludion, определенной областью действия и, вероятно, другими вещами в довольно запутанной системе, которая является пользовательскими директивами Angular, различные вещи, которые интуитивно должны быть доступны, кажутся недоступными. А именно: весь смысл включения состоит в том, чтобы иметь доступ к родительской области внутри директивы.

Если шаблон директивы включает тег ng-transclude внутри ng-repeat, кажется, что включенный контент не сохраняет доступ к внешней области (области приложения, а не области действия директивы). Тем не менее, если это делается без использования директивы (только ng-repeat) или если директива не имеет ng-repeat, доступ работает как положено.

Упрощенный пример

Я сделал демонстрацию проблемы, показывающую все три случая:

http://plnkr.co/edit/np6lTmeTrKioo4kb8SP6?p=preview

Обратите внимание, что зеленые «данные внешней области» не отображаются, когда директива включения содержит ng-repeat. Данные, которые передаются явно (поля), связываются, как и ожидалось, но смысл включения в том, что нам не нужно явно передавать все данные, которые могут быть связаны.

Я использую AngularJS 1.2.0-rc.3.

Предыдущие попытки

Я потратил на это весь день. Я не видел никого с точно моим сценарием: обычно была какая-то тонкая причина, по которой включение не требовалось, или они хотели получить доступ к родительской области внутри самой директивы. Я почти на 100% уверен, что это тонкая проблема, связанная с областью действия, и я недостаточно хорошо знаю Angular, чтобы тонко ее решить. Не имея лучшего направления, я уже перепробовал (наугад) множество комбинаций различных форм директивного объема, включения и замены с предсказуемо небольшими результатами.


person Dwight    schedule 05.11.2013    source источник


Ответы (1)


Несколько новых вопросов SO начали появляться в поиске после того, как я написал этот вопрос, поэтому похоже, что этот вопрос на самом деле невероятно распространен. Вот пример:

Изолированная директива AngularJS с ng-repeat прерывает область включения

Включенная область становится дочерней областью ng-repeat, а не внешней областью, потому что ng-repeat создает область. До сих пор мои поиски не смогли показать, почему ng-repeat действительно нуждается в области видимости. Учитывая, насколько распространен этот конкретный вариант использования, мне интересно, сможет ли Angular включить этот тип построения в будущем.

person Dwight    schedule 05.11.2013