У меня есть следующий html
<section class="result" ng-repeat="record in results | orderBy: sortRecordByTimestamp" ng-init="highlights(record)" ng-class="level">
<!-- some stuff -->
</section>
Моя область имеет $scope.level = ''
в init. Функции:
function highlights(record) {
// will contain more logic
console.log('Highlighting...');
level(record);
}
а также
function level(record) {
$scope.spreadsheet.forEach(function(row) {
if (row.Name.indexOf(record.event) > -1) {
$scope.level = 'level' + row.Level;
}
});
}
Он правильно устанавливает $scope.level
как и предполагается, однако, он разделяется по всем моим результатам.
Разве ng-repeat
создает дочерние области, а примитивы перезаписываются?
РЕДАКТИРОВАТЬ:
Изменен html:
<section class="result" ng-repeat="record in results | orderBy: sortRecordByTimestamp" ng-class="level(record)">
<!-- code -->
</section>
и js:
$scope.level = function(record) {
$scope.spreadsheet.forEach(function(row) {
if (row.Name.indexOf(record.event) > -1) {
console.log('Highlighting: level' + row.Level);
return 'level' + row.Level;
}
});
}
Он регистрирует правильные значения, однако ng-class никогда не устанавливается. Зачем?
EDIT 2:
Чтобы уточнить, что я пытаюсь сделать:
$scope.spreadsheet
содержит данные для сравнения с данными record
. Матч можно найти в трех экземплярах, каждый из которых перечисляется в row.Level
зависимости от row.Name
. Так level(record)
возвращает CSS класс level1, level2 или level3.
У них есть background:/* color */
свойство, установленное для них. Таким образом, каждая строка, у которой есть record.event
найдена в row.Name
(они точно не совпадают, поэтому no ===
) окрашивается в зависимости от того, какой уровень важности он задан.
В первый раз, когда я попытался заставить дочерние области наследовать свойство $scope.level
и определить его при создании элемента (это почему ng-init
), я сделал $scope.level
функцию, возвращающую уровень. Тем не менее, он запускается на ВСЕХ записях с результатом последней итерации.
Как определить отдельный уровень для каждой записи?
ng-repeat
не создает изолированную область, он создает дочернюю область, которая прототипически унаследована от ее родительской области. Если вы посмотрите на API ng-repeat
вы обнаружите, что директива ng-repeat
имеет scope: true
в ней, которая отвечает за создание прототипически унаследованной области.
Чтобы получить доступ к свойству родительской области в пределах дочернего object
, вы должны объявить тип object
, чтобы в соответствии с правилом точки вы могли получить доступ к своим дочерним свойствам внутри дочернего элемента. Если вы используете primitive
типы, вы должны указать $parent.
для доступа к родительской переменной области.
Существует множество способов, предоставляемых API ng-repeat
чтобы отслеживать, на каком элементе вы находитесь, $index
на месте, на каком index
вы находитесь.
$index
number iterator offset повторного элемента (0..length-1)
$first
boolean true, если повторный элемент является первым в итераторе.
$middle
boolean true, если повторяющийся элемент находится между первым и последним в итераторе.
$last
boolean true, если повторный элемент является последним в итераторе.
$even
booleantrue
если позиция итератора $ index является четной (в противном случае ложной).
$odd
boolean true, если позиция итератора $ index нечетна (в противном случае ложна).
вы можете создать общий контроллер и определить переменную области видимости в этом контроллере, а затем вы можете дать ссылку на общий контроллер в этот файл контроллера, где вы хотите получить эту переменную.
ng-init
. Назначениеng-init
- создать псевдоним для специальных свойствng-repeat
таких как$first
,$last
,$index
и т. Д. Он не предназначен для установки переменных или запуска функции. docs.angularjs.org/api/ng/directive/ngInit