查看:
我有一行重复,每行都有一个保存按钮,可以单独保存每个对象。如果没有进行任何更改,我希望禁用此按钮。
<tr ng-repeat="option in options | filter:search">
<a ng-click="save(option)" ng-disabled="isUnchanged(option)">Save</a>
</tr>
位指示:
所以我将选项对象传递给函数,我在数组中得到它的索引位置。然后比较这个选项&#39;在apiKeyOptions [index]中反对其原始self,它作为服务注入。
angular.module('PartOfApp')
.controller('PartOfAppCtrl', function( $scope, ... apiKeyOptions) {
$scope.options = apiKeyOptions;
$scope.isUnchanged = function(option) {
var index = $scope.options.indexOf(option);
//compare object to the original
if(option.value == apiKeyOptions[index].value && apiKeyOptions[index].setting == option.setting){
//then no changes have been made to this
return true;
}else{
return false;
}
出于某种原因,当任何数据发生变化时,我会得到一个100个错误的控制台,说apiKeyOptions [index] .value和apiKeyOptions [index] .setting是unfind。
该应用程序完美无缺,因为它应该返回true,如果它们相同但仍然会抛出
TypeError: Cannot read property 'value' of undefined
关于apiKeyOptions [index]
如果我是console.log(apiKeyOptions [index] .value)我没有得到任何未定义的值,并且所有日志都正确记录。
我猜我打破了一些角度规则,如果有人能提供帮助那就太棒了。
apiKeyOptions概述:
apiKeyOptions是一个包含多达50个对象的数组
每个对象的格式为
{
defaultValue: boolean,
description: null,
name: String,
setting: "Default" or Boolean,
value: Boolean
}
在以下评论后添加: 如果我添加 -
console.log(index);
console.log(apiKeyOptions[index]);
到函数$ scope.isUnchanged,我得到了预期的结果 例如:
13
Object {name: "LOREM IPSUM", description: null, defaultValue: false, setting: "default", value: false…}
所以索引并不总是-1。我将对象传递给函数而不是$ index的原因是因为过滤器|搜索,以便索引将根据搜索而改变。
已修复
如下面的答案所示。我得到了一个index = -1错误,但它被埋没在100个CORRECT日志输出中。
奇怪的是,这并没有阻止应用程序工作,我需要深入了解ng-disabled如何绑定到某个值。要修复我只需用
替换indexOffor (var i = 0; i< $scope.options.length; i++ ){
if($scope.options[i].name == option.name){
var index = i;
}
}
答案 0 :(得分:1)
问题似乎是传递给$scope.isUnchanged = function(option) {
的参数
由于ng-repeat为每个循环创建了一个新的范围,我怀疑&#39;选项&#39;每个循环可用的是一个新对象,并且不会引用&#39;选项&#39;阵列。
<tr ng-repeat="option in options | filter:search">
因此,您的isUnchanged
函数将接收参数作为新对象,因此下面的代码始终返回-1。因为 indexOf 匹配数组中的给定参数,因为参数&#39;选项&#39;是一个对象,并没有引用(引用比较)相同的数组元素,因此找不到匹配项。即var a = {id:1};var b = [a]; b.indexOf({id:1}) === -1; b.indexOf(a) === 0;
var index = $scope.options.indexOf(option);//always be -1 in your case
// therefore apiKeyOptions[index] will always be undefined
作为一种解决方法,您应该从视图中将 $ index 传递给isUnchanged
。