У меня есть несколько ngRepeats
генерировать содержимое таблицы, в зависимости от вида, которое хочет видеть пользователь, для генерации таблицы используется другой ngRepeat
. Когда пользователь переключает свое представление, и одно из следующего удаляется из DOM, а другое добавлено, новый ngRepeat
не ссылается на тот же массив pagination.filteredData
.AngularJs - Ссылка на то же свойство scope из нескольких ngRepeat's
Пример:Main
- мой контроллер, используя controller as
синтаксис.
<tr ng-if="Main.tableConfig.programGranularity == 'overall'" ng-repeat="item in Main.pagination.filteredData = (Main.data.overallData | filterByDateRange | filter: Main.tableConfig.generalSearch | orderBy: ['Date', 'Name']) | startFrom: Main.pagination.startAtIndex | limitTo: Main.pagination.pageSize">
<td ng-repeat="column in Main.tableConfig.columnsConfig | selectColumnsByGranularity: Main.tableConfig.programGranularity">
<span ng-if="!column.isDate" ng-bind="item[column.dataValue] | ifEmpty: 0"></span>
<span ng-if="column.isDate" ng-bind="item[column.dataValue] | date:'MM/dd/yyyy': 'UTC' | ifEmpty: 0"></span>
</td>
</tr>
<tr ng-if="Main.tableConfig.programGranularity == 'team'" ng-repeat="item in Main.pagination.filteredData = (Main.data.teamData | filterByDateRange | filter: Main.tableConfig.generalSearch | orderBy: ['Date', 'Name']) | startFrom: Main.pagination.startAtIndex | limitTo: Main.pagination.pageSize">
<td ng-repeat="column in Main.tableConfig.columnsConfig | selectColumnsByGranularity: Main.tableConfig.programGranularity">
<span ng-if="!column.isDate" ng-bind="item[column.dataValue] | ifEmpty: 0"></span>
<span ng-if="column.isDate" ng-bind="item[column.dataValue] | date:'MM/dd/yyyy': 'UTC' | ifEmpty: 0"></span>
</td>
</tr>
<tr ng-if="Main.tableConfig.programGranularity == 'colleague'" ng-repeat="item in Main.pagination.filteredData = (Main.data.parsedData | filterByDateRange | filter: Main.tableConfig.generalSearch | orderBy: ['Date', 'Name']) | startFrom: Main.pagination.startAtIndex | limitTo: Main.pagination.pageSize">
<td ng-repeat="column in Main.tableConfig.columnsConfig | selectColumnsByGranularity: Main.tableConfig.programGranularity">
<span ng-if="!column.isDate" ng-bind="item[column.dataValue] | ifEmpty: 0"></span>
<span ng-if="column.isDate" ng-bind="item[column.dataValue] | date:'MM/dd/yyyy': 'UTC' | ifEmpty: 0"></span>
</td>
</tr>
Я хочу того же pagination.filteredData
массив должен быть установлен на каждой из ngRepeat
директив. Однако только первый запущенный ngRepeat
устанавливает значение, и никакое другое ngRepeat
не установит его снова.
Я пробовал ngInit
и инициализировал объект с помощью pagination
внутри него и ссылаясь на это в моем ngRepeat
. Я также пробовал использовать $parent.pagination.filteredData
.
Использование AngularJS v1.5.0
Как получить эту работу?
Похож на https://stackoverflow.com/questions/38235907/angularjs-service-variable-not-being-set-inside-of-ngrepeat, но переформулирован и принципиально отличается. Решение этой же проблемы.
Редактировать: Реализован для использования синтаксиса controller as
, проблема по-прежнему сохраняется. Мне кажется, что когда я переключаюсь на другой ngRepeat, создается новый массив и ссылка вместо того, чтобы перезаписывать текущие значения массивов.
Я вижу этот вопрос почти каждый день, так и в угловом теге.Вам нужно использовать синтаксис «контроллер как» углов, который позволяет вам быть однозначным в отношении той области, которую вы используете в своих представлениях. Вот фантастическая статья, на которую я всегда ссылаюсь, которая объясняет это очень хорошо: https://toddmotto.com/digging-into-angulars-controller-as-syntax/ – mhodges
Вы пробовали 'ng-init =" pagination.startAtIndex = 0 «'? –
Вы можете фильтровать данные вручную в контроллере, введя '$ filter', задайте результат в свойстве службы, а затем повторите итерацию ng-repeat по предварительно отфильтрованным результатам. – adam0101