在Angular

时间:2016-07-29 01:27:52

标签: angularjs

我知道在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对象,而不是它的某些副本?

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用splice从数组中删除项目,而不是使用已过滤的列表重新分配数组?

vm.removePackageFromBin = function (package, bin) {
    var idx = bin.indexOf(package);
    bin.splice(idx, 1);
};