Я знаю, что прохождение объектов в Angular - это то же самое, что передавать объекты в vanillaJs, что меня толкает, почему моя модель не обновляется.
У меня есть ящики, содержащие пакеты. Учитывая, что packageId, мне нужно найти его, и удалить пакет из него.
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, на мой взгляд, не обновляется, чтобы отразить пакет, который был удален из bin.
т.е. эта строка:
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, в отличие от какой-то его копии?
Вы пытались использовать сплайс, чтобы удалить элемент из массива вместо переназначения массива с фильтрованным списком?
vm.removePackageFromBin = function (package, bin) {
var idx = bin.indexOf(package);
bin.splice(idx, 1);
};