【发布时间】:2016-04-21 13:25:39
【问题描述】:
我通过ng-repeat-ing 在一个数组上生成表单。每个生成的表单都添加到 vm.forms 对象中。当从数组中删除一个项目时,我正在迭代相应的表单被删除,但 vm.forms 对象仍然有原始表单的键,导致我出现 undefined 错误。
angular
.module('myApp', [])
.controller('FormLooper', FormLooper);
function FormLooper() {
var vm = this;
vm.children = [{
name: 'Sarah',
age: 9,
}, {
name: 'John',
age: 13,
}];
vm.removeChild = removeChild;
vm.forms = {};
vm.showSummary = false;
vm.triggerError = triggerError;
function triggerError() {
console.log('Available forms:', vm.forms);
console.log('property names:', Object.getOwnPropertyNames(vm.forms));
Object.getOwnPropertyNames(vm.forms).map(function(key) {
console.log('key', key, vm.forms[key]);
return vm.forms[key].$valid; // This will result in an `undefined` error
});
}
function removeChild(index) {
vm.children.splice(index, 1);
}
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.6/angular.min.js"></script>
<body ng-app="myApp">
<div ng-controller="FormLooper as vm">
<div ng-repeat="child in vm.children">
<form name="vm.forms.formId{{ $index }}">
<label>
Name: <input ng-model="child.name">
</label>
<br>
<label>
Age: <input type="number" ng-model="child.age">
</label>
</form>
<button ng-click="vm.removeChild($index)">RemoveChild</button>
</div>
<button ng-click="vm.triggerError()">Trigger Error (check your console output)</button>
</div>
</body>
或者,与 JSFiddle 相同的代码:http://jsfiddle.net/Tobbe/8eohL2nq/2/
不应该用角度删除整个对象属性吗?
我可以通过在removeChild 函数中手动delete-ing 对象属性来解决这个问题,但在我的实际代码中,我不想像那样混合这些问题。另一个简单的解决方案是只检查undefined 或map 调用的函数中的类似内容。但我觉得我不应该求助于那个......
那么,我在这里错过了什么吗?
编辑:
请注意控制台输出并注意vm.forms 对象在创建表单时已正确填充。 Angular 自己完成这一切 :) 所以它会在创建表单时添加到对象中,但在删除表单时它不会从对象中删除。这是一个错误吗?
【问题讨论】:
-
你似乎从来没有真正初始化过 vm.forms(至少在 js 中没有)
-
我愿意
vm.forms = {};。这还不够吗?
标签: javascript angularjs forms