如何有条件地推动一个可观察数组中的项目?

我想push一个新的项目上一个observableArray ,但只有当项目不存在。 KnockoutJS中是否有任何“查找”function或推荐模式?

我已经注意到, observableArray上的remove函数可以接收一个传入条件的函数。 我几乎想要相同的function,但是只有当传入的条件是或者不是真时才会推送它。

一个observableArray公开一个indexOf函数(封装到ko.utils.arrayIndexOf )。 这可以让你做到:

 if (myObservableArray.indexOf(itemToAdd) < 0) { myObservableArray.push(itemToAdd); } 

如果这两个实际上不是对同一对象的引用,并且您想运行自定义比较逻辑,那么可以使用ko.utils.arrayFirst如:

 var match = ko.utils.arrayFirst(myObservableArray(), function(item) { return itemToAdd.id === item.id; }); if (!match) { myObservableArray.push(itemToAdd); } 

谢谢RP。 这是一个使用你的build议来通过我的视图模型中的对象的“ID”属性返回“名称”属性的例子。

  self.jobroles = ko.observableArray([]); self.jobroleName = function (id) { var match = ko.utils.arrayFirst(self.jobroles(), function (item) { return item.id() === id(); //note the () }); if (!match) return 'error'; else return match.name; }; 

在HTML中,我有以下($父是由于这是在一个表行循环):

 <select data-bind="visible: editing, hasfocus: editing, options: $parent.jobroles, optionsText: 'name', optionsValue: 'id', value: jobroleId, optionsCaption: '-- Select --'"> </select> <span data-bind="visible: !editing(), text: $parent.jobroleName(jobroleId), click: edit"></span></td> 

searchko.observableArray中的对象

 function data(id,val) { var self = this; self.id = ko.observable(id); self.valuee = ko.observable(val); } var o1=new data(1,"kamran"); var o2=new data(2,"paul"); var o3=new data(3,"dave"); var mysel=ko.observable(); var combo = ko.observableArray(); combo.push(o1); combo.push(o2); combo.push(o3); function find() { var ide=document.getElementById("vid").value; findandset(Number(ide),mysel); } function indx() { var x=document.getElementById("kam").selectedIndex; alert(x); } function getsel() { alert(mysel().valuee()); } function findandset(id,selected) { var obj = ko.utils.arrayFirst(combo(), function(item) { return id=== item.id(); }); selected(obj); } findandset(1,mysel); ko.applyBindings(combo); <select id="kam" data-bind="options: combo, optionsText: 'valuee', value: mysel, optionsCaption: 'select a value'"> </select> <span data-bind="text: mysel().valuee"></span> <button onclick="getsel()">Selected</button> <button onclick="indx">Sel Index</button> <input id="vid" /> <button onclick="find()">Set by id</button> 

http://jsfiddle.net/rathore_gee/Y4wcJ/

我会在变化之前添加“valueWillMutate()”,之后添加“valueHasMutated()”。

 for (var i = 0; i < data.length; i++) { var needChange = false; var itemToAdd = data[i]; var match = ko.utils.arrayFirst(MyArray(), function (item) { return (itemToAdd.Code === item.Code); }); if (!match && !needChange) { MyArray.valueWillMutate(); needChange = true; } if (!match) { MyArray.push(itemToAdd); } } if (needChange) { MyArray.valueHasMutated(); }