ng-repeat

时间:2015-09-23 18:30:14

标签: javascript html angularjs angularjs-ng-repeat ng-repeat

我有以下html

<section class="result" ng-repeat="record in results | orderBy: sortRecordByTimestamp" ng-init="highlights(record)" ng-class="level">
          <!-- some stuff -->
</section>

我的范围在init上有$scope.level = ''。功能是:

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。为什么呢?

编辑2:

澄清我想要做的事情:

$scope.spreadsheet包含要与record数据进行比较的数据。匹配可以在3个实例中找到,每个实例都在row.Level中枚举,具体取决于row.Name。因此,level(record)会返回 level1 level2 level3 的css类。

这些属性设置为background: /* color */属性。因此,在record.event中找到row.Name的每一行(它们不完全匹配,这就是为什么没有===)根据给定的重要程度而着色。

我第一次尝试让子范围继承$scope.level属性并在元素创建时确定它(这就是为什么ng-init),然后我使$scope.level成为一个返回水平。但是,它会使用上一次迭代的结果触发所有记录。

如何确定每个记录的级别?

2 个答案:

答案 0 :(得分:2)

ng-repeat没有创建一个独立的范围,它确实创建了一个子范围,该范围是从其父范围原型继承的。如果您查看ng-repeat API,您会发现ng-repeat指令中包含scope: true,该指令负责创建原型继承的范围。

要访问子范围内父范围的属性,您应该已声明object类型,以便根据点规则可以访问其子范围内的子属性。如果您使用的是primitive类型,那么您应该提及$parent.来访问父范围变量。

ng-repeat API提供了多种方式来跟踪您所在的元素,$index就位于index元素所在的位置。

  

$index重复元素的数字迭代器偏移量(0..length-1)

     

$first boolean如果重复元素是第一个,则为true   迭代器。

     

$middle boolean如果重复元素介于两者之间,则为true   迭代器中的第一个和最后一个。

     

$last布尔值如果是   重复元素在迭代器中是最后一个。

     

$even布尔true如果   迭代器位置$ index是偶数(否则为false)。

     

$odd boolean如果迭代器位置$ index为奇数,则为true(否则为false)。

答案 1 :(得分:-1)

您可以在此控制器中创建一个公共控制器并定义一个范围变量,然后您可以将公共控制器的引用提供到您想要获取此变量的控制器文件中。