Подтвердить что ты не робот

Передайте значение родительской области в цикл ng-repeat в Angular

Это должен быть очень простой вопрос, но все обходные пути, которые я нашел, сложны. Я перебираю массив объектов при использовании ng-repeat в шаблоне следующим образом:

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ campaign.name }} ...
</div>

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

Спасибо заранее.

4b9b3361

Ответ 1

Вы можете получить доступ к родительской области с помощью $parent

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ $parent.campaign.name }} ...
</div>

Ответ 2

Другим методом может быть передача родительской области как переменной области видимости в директиву i.e.

<my-directive 
    md-parent-scope="this" 
    ng-repeat="item in items"></my-directive>

Это немного беспорядочно, но у вас больше контроля над тем, что на самом деле является родителем, и может что-то передать.

Ответ 3

Этот способ работает, который не использует $parent. Он ищет вверх по вложенным областям, чтобы найти объект, который вы используете, однако многие области, которые он должен пройти.

В области, содержащей список, вы можете определить объект со списком как свойство, например:

$scope.obj = {};
$scope.obj.items = ['item1','item2','item3'];

Затем ng-repeat выглядит следующим образом:

<div ng-repeat="item in obj.items | filter:'item3' track by $index">
    {{obj.items[ obj.items.indexOf(item) ]}}
</div>

(вам нужно использовать obj.items[ obj.items.indexOf(item) ], а не obj.items[ $index ], потому что $index - это индекс фильтрованного массива, а не оригинал)

Причина этого в том, что, пока obj не существует в текущей области, поскольку вы пытаетесь получить доступ к его свойству, Angular будет смотреть выше текущей области, а не давать вам ошибку (если вы просто попытались {{obj}} это будет undefined, а Angular будет рад дать вам ничего, а не просматривать более высокие области). Это полезная ссылка о вложенных областях: http://www.angularjshub.com/examples/basics/nestedcontrollers/

В моем случае мне понадобился track by $index, потому что у меня был вход с ng-model, связанный с элементом в массиве, и всякий раз, когда модель обновляется, вход будет размываться, потому что я думаю, что HTML был повторно отображен, Последствием использования track by $index является то, что элементы в массиве с одинаковыми значениями будут повторяться. Если вы измените один из тех, кроме первого, произойдет странное. Возможно, вы можете фильтровать уникальность, чтобы этого избежать.

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