我知道在Angular中传递对象与在vanillaJs中传递对象相同,我不知道我的模型没有被更新。
我有包含包的箱子。给定一个packageId,我需要找到它所在的bin,然后从中删除它。
vm.Bins = []; // bins of packages
vm.debinPackage = function (packageId) {
var bin = vm.getBin(packageId);
var packagge = vm.getPackage(packageId, bin.Packages);
vm.removePackageFromBin(packagge, bin);
};
vm.getBin = function (binId){
return $filter('filter')(vm.Bins, function(bin, index) {
return bin.Id == binId;
})[0];
};
vm.getPackage = function (packageId, packages) {
return $filter('filter')(packages, function(packageItem, index) {
return packageItem.Id == packageId;
})[0];
};
vm.removePackageFromBin = function (packagge, bin) {
bin = $filter('filter')(bin.Packages, function(packageItem, index) {
return packageItem.Id != packagge.Id;
});
};
<button ng-click="adminManifestVm.debinPackage(packageId)"></button>
{{ adminManifestVm.Bins }}
所以,我的控制器中的 vm.Bins ,因此我的视图中的 adminManifestVm.Bins 不会更新,以反映已经包含的软件包从垃圾箱中取出。
即。这一行:
vm.removePackageFromBin(packagge, bin);
实际上并不会导致更新的 vm.Bins 对象。
我认为问题在于,当我得到bin对象时,我使用var作为持有者:
var bin = vm.getBin(packageId);
并且它以某种方式与我的 vm.Bins 对象分离。
但我无法弄清楚如何操纵 vm.Bins 中的实际对象。
我尝试直接操作对象,而不是通过var
vm.debinPackage = function (packageId) {
var binId = vm.getBinIdWithPackage(packageId);
var packagge = vm.getPackage(packageId, vm.getBin(binId).Packages);
vm.removePackageFromBin(packagge, vm.getBin(binId));
};
但不仅这不起作用,它开始使我的代码不可读。
如何确保我操作的bin对象是vm.Bin中的bin对象,而不是它的某些副本?
答案 0 :(得分:1)
您是否尝试过使用splice从数组中删除项目,而不是使用已过滤的列表重新分配数组?
vm.removePackageFromBin = function (package, bin) {
var idx = bin.indexOf(package);
bin.splice(idx, 1);
};