Переменная $ scope совместно используется by-repeat

0

У меня есть следующий 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 функцию, возвращающую уровень. Тем не менее, он запускается на ВСЕХ записях с результатом последней итерации.

Как определить отдельный уровень для каждой записи?

  • 0
    это не совсем правильный способ использования ng-init . Назначение ng-init - создать псевдоним для специальных свойств ng-repeat таких как $first , $last , $index и т. Д. Он не предназначен для установки переменных или запуска функции. docs.angularjs.org/api/ng/directive/ngInit
  • 0
    я знаю, я пытался найти другое решение этой проблемы, прежде чем ... проверить редактирование, кажется аккуратнее, однако, не работает
Показать ещё 2 комментария
Теги:
angularjs-ng-repeat
ng-repeat

2 ответа

2

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 boolean true если позиция итератора $ index является четной (в противном случае ложной).

$odd boolean true, если позиция итератора $ index нечетна (в противном случае ложна).

-1

вы можете создать общий контроллер и определить переменную области видимости в этом контроллере, а затем вы можете дать ссылку на общий контроллер в этот файл контроллера, где вы хотите получить эту переменную.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню