AngularJs为什么在ng禁用函数上未定义对象

AngularJs why is object undefined on ng-disabled function?

本文关键字:函数 未定义 对象 为什么 ng AngularJs      更新时间:2023-09-26

VIEW:

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

<tr ng-repeat="option in options | filter:search">
    <a ng-click="save(option)" ng-disabled="isUnchanged(option)">Save</a>
</tr>

控制器:

所以我把option对象传递给函数,得到它在数组中的索引位置。然后将此"option"对象与其作为服务注入的apiKeyOptions[index]中的原始自身进行比较。

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是未绑定的。

如果它们相同,但仍然抛出,则该应用程序可以完美地工作,因为它应该返回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,是因为过滤器|搜索,所以索引会根据搜索而变化。

固定

如下面的答案所示。我得到了一个索引=-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;
            }
       }

问题似乎出在传递给$scope.isUnchanged = function(option) {的参数上由于ng repeat为每个循环创建了一个新的作用域,我怀疑每个循环可用的"option"将是一个新对象,并且不会引用"options"数组。

<tr ng-repeat="option in options | filter:search">

因此,isUnchanged函数将接收作为新对象的参数,因此下面的代码总是返回-1。因为indexOf匹配数组中的给定参数,而且参数"option"是一个对象,不引用(引用比较)数组的同一元素,因此找不到匹配项。即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