【发布时间】:2015-12-03 01:06:12
【问题描述】:
我检查了类似的问答,但没有解决我的问题。
我想动态设置一个输入的类,考虑下面Plunkr。
如你所见,我有一个字段,定义如下:
<input type="text" ng-model="Person.Name" ng-class="{'mandatory': IsFieldMandatory('Name')}" />
该函数的代码如下:
self.IsFieldMandatory = function(field){
var isMandatory = true;
var value = $scope.Person.Name;
$scope.Cnt = $scope.Cnt + 1;
return value.length == 0;
}
如您所见,它会在页面加载时触发 11(!) 次(或任何进一步的操作,如模糊)。
PS:该功能不起作用,因为我收到此错误:
Error: $rootScope:infdig Infinite $digest Loop
由于 $scope.Cnt 增量而发生。如果发表评论,它会起作用(但我不知道触发器的数量)。
PPS:
我该如何使用它?:
var value = $parse('Person.' + field);
这样会更好,因为这样该函数将适用于任何领域。它需要,在现实世界的场景中。 (这返回一个函数,而不是一个实际值)
谢谢!
更新
Plunkr 的例子似乎没有什么价值,所以取而代之的是原始函数:
self.IsMandatory = function (field) {
console.log('test');
if (self.IsMandatoryFieldsLoaded == true) {
var idxAsync = self.MandatoryFields.indexOf(field);
return idxAsync > -1;
}
return false;
}
如您所见,我没有做任何修改,只是读取。我有 11 个字段,但这个函数的“测试”记录却写了 198 次!
【问题讨论】:
-
var value = $scope.Person[field]就足够了。是的,你不应该在 watch 函数中更新你的模型($scope对象),因为每个这样的更改基本上都会触发另一个 watchers 调用。 -
错误是由
$scope.Cnt = $scope.Cnt + 1;引起的,如果你删除该行它只会执行2次 -
看起来该值有效。你是什么意思'在手表功能中更新模型'?我只是在读取值,而不是设置任何值(忘记了示例中的 cnt)。
-
当然,如果您不使用
$scope.cnt,您只会读取值,并且没有“荒谬数量”的摘要调用。 -
@Spikee - 我检查了 plunker 代码,您似乎想根据某些条件验证字段。可能你应该试试 ng-required
标签: javascript .net angularjs asp.net-mvc