我有以下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
成为一个返回水平。但是,它会使用上一次迭代的结果触发所有记录。
如何确定每个记录的级别?
答案 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)
您可以在此控制器中创建一个公共控制器并定义一个范围变量,然后您可以将公共控制器的引用提供到您想要获取此变量的控制器文件中。