Ответ 1
Вы можете получить доступ к родительской области с помощью $parent
<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'">
{{ message.subject }} ... {{ $parent.campaign.name }} ...
</div>
Это должен быть очень простой вопрос, но все обходные пути, которые я нашел, сложны. Я перебираю массив объектов при использовании ng-repeat в шаблоне следующим образом:
<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'">
{{ message.subject }} ... {{ campaign.name }} ...
</div>
Так как ng-repeat создает новую область видимости, объект "кампания" с контроллера не представляется доступным. Есть ли способ (помимо добавления объекта кампании к каждому элементу в моем массиве) получения этого значения?
Спасибо заранее.
Вы можете получить доступ к родительской области с помощью $parent
<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'">
{{ message.subject }} ... {{ $parent.campaign.name }} ...
</div>
Другим методом может быть передача родительской области как переменной области видимости в директиву i.e.
<my-directive
md-parent-scope="this"
ng-repeat="item in items"></my-directive>
Это немного беспорядочно, но у вас больше контроля над тем, что на самом деле является родителем, и может что-то передать.
Этот способ работает, который не использует $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, поэтому, пожалуйста, прокомментируйте, если есть что-то большое, что мне не хватает. Но это работает, поэтому я использую его как минимум.