2014-04-07 58 views
0

在我的小提琴,你可以從一個列表複製到另一個項目,也就是持有普通的物品,用於比較的複製列表。現在,您可以刪除第二個列表中的所有項目,但我只希望能夠刪除那些包含普通項目的項目。從列表中刪除的項目,如果在比較列表不存在

代碼如下所示:

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()); 

JSFiddle

回答

1

的幫助下將ko.utils.arrayFirst可以檢查被點擊項目是在原有的列表(storedProceduresInDB2Orig)。

如果ko.utils.arrayFirst回報的東西,那麼你只需要return falseremove回調和您的項目將不會被刪除:

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