在我的小提琴中,您可以将项目从列表复制到另一个列表,还有一个包含普通项目的重复列表,用于比较。现在你可以删除第二个列表中的所有项目,但我只希望能够删除那个包含普通项目的项目中不存在的项目。
代码如下所示:
var SProcsViewModel = function () {
var self = this;
self.storedProceduresInDB1 = ko.observableArray([{
Name: "Sp1",
Id: 1
}, {
Name: "Sp2",
Id: 2
}, {
Name: "Sp3",
Id: 3
}, {
Name: "Sp4",
Id: 4
}]);
self.storedProceduresInDB2Orig = ko.observableArray([{
Name: "Sp3",
Id: 3
}, {
Name: "Sp4",
Id: 4
}, {
Name: "Sp7",
Id: 7
}, {
Name: "Sp8",
Id: 8
}]);
self.storedProceduresInDB2 = ko.observableArray([{
Name: "Sp3",
Id: 3
}, {
Name: "Sp4",
Id: 4
}, {
Name: "Sp7",
Id: 7
}, {
Name: "Sp8",
Id: 8
}]);
self.selectedStoredProceduresInDb1 = ko.observableArray();
self.selectedStoredProceduresInDb2 = ko.observableArray();
self.copyToDb2 = function () {
var sprocs = [];
console.log('self.selectedStoredProceduresInDb1()', self.selectedStoredProceduresInDb1());
ko.utils.arrayForEach(self.selectedStoredProceduresInDb1(), function (value) {
// console.log('arrayForEach',value,self.storedProceduresInDB2);
var match = ko.utils.arrayFirst(self.storedProceduresInDB2(), function (item) {
console.log('item in storedProceduresInDB2', value, item);
return value.Id === item.Id;
});
if (!match) {
console.log('No match, so add to sprocs', value);
sprocs.push(value);
} else {
console.log('Match found for:', value);
}
});
ko.utils.arrayForEach(self.selectedStoredProceduresInDb1(), function (value) {
console.log('storedProceduresInDB1', value);
});
console.log('sprocs', sprocs);
ko.utils.arrayPushAll(self.storedProceduresInDB2, sprocs)
};
self.removeFromDb2 = function(item, event){
self.storedProceduresInDB2.remove(function(item) {
return item.Name == $(event.currentTarget).find("option:selected").text();
});
}
return self;
};
ko.applyBindings(new SProcsViewModel());
答案 0 :(得分:1)
在ko.utils.arrayFirst
的帮助下,您可以检查所点击的项目是否在原始列表中(storedProceduresInDB2Orig
)。
如果ko.utils.arrayFirst
返回了某些内容,那么您只需要在return false
回调中remove
,您的商品就不会被移除:
self.removeFromDb2 = function(item, event){
self.storedProceduresInDB2.remove(function(item) {
var nameToRemove = $(event.currentTarget).find("option:selected").text();
var isInOrig = ko.utils.arrayFirst(self.storedProceduresInDB2Orig(),
function(item){
return item.Name == nameToRemove;
});
if (isInOrig)
return false;
return item.Name == nameToRemove;
});
}
演示JSFiddle。