AngularJs为什么在ng禁用函数上未定义对象
AngularJs why is object undefined on ng-disabled function?
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
。
- 现有函数未定义
- jQuery$.post可以在chrome、safari中工作,但不能在FF中工作(声明成功回调函数未定义)
- AngularJS ng repeat显示原型函数未定义
- jQuery onclick 函数:未定义不是一个函数
- 函数未定义
- 为什么在jsfiddle中显示ReferenceError:函数未定义
- 函数未定义,实际定义时为
- 函数未定义的Javascript(Basic)
- ajax函数未定义
- 为什么window.onload函数未定义
- 模块模式:函数未定义
- 包含的javascript源代码通过PHP,onmousemove事件,函数未定义
- 单击链接时出现函数未定义错误
- AngularJS和Angular Snap:SSnap构造函数未定义
- 在Node.js中,从同一文件中的另一个函数引用一个函数会导致'ReferenceError:-函数-未定义
- symfony trick javascript函数未定义
- 不断获取JS函数未定义错误
- AngularJS HTTP 资源 - 响应函数未定义
- 函数未定义,参数格式
- JavaScript 中的函数未定义