AngularJs为什么在ng-disabled函数上对象未定义?

时间:2014-11-11 11:26:53

标签: javascript angularjs typeerror

查看:

我有一行重复,每行都有一个保存按钮,可以单独保存每个对象。如果没有进行任何更改,我希望禁用此按钮。

<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如何绑定到某个值。要修复我只需用

替换indexOf
for (var i = 0; i< $scope.options.length; i++ ){
            if($scope.options[i].name == option.name){
                var index = i;
            }
       }

1 个答案:

答案 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