Knockout.js 如何有条件地推送可观察数组中的项?

Knockout.js 如何有条件地推送可观察数组中的项?,knockout.js,Knockout.js,我想将一个新项目推到可观察的array上,但前提是该项目尚未出现。在KnockoutJS中是否有任何“查找”功能或推荐模式可以实现这一点 我注意到,observearray上的remove函数可以接收传递条件的函数。我几乎想要相同的功能,但只在传入的条件为真或不为真时才推送它。observableArray公开了一个indexOf函数(包装到ko.utils.arrayIndexOf)。这允许您执行以下操作: if (myObservableArray.indexOf(itemToAdd) &l

我想
将一个新项目推到
可观察的array
上,但前提是该项目尚未出现。在KnockoutJS中是否有任何“查找”功能或推荐模式可以实现这一点


我注意到,
observearray
上的
remove
函数可以接收传递条件的函数。我几乎想要相同的功能,但只在传入的条件为真或不为真时才推送它。

observableArray公开了一个
indexOf
函数(包装到
ko.utils.arrayIndexOf
)。这允许您执行以下操作:

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

感谢RP。下面是一个使用您的建议从我的视图模型中通过对象的“id”属性返回“name”属性的示例

    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中,我有以下内容($parent是因为它位于表行循环中):


在ko.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>
功能数据(id,val)
{var self=this;
self.id=ko.可观察(id);
self.valuee=ko.observable(val);}
var o1=新数据(1,“kamran”);
var o2=新数据(2,“保罗”);
var o3=新数据(3,“dave”);
var mysel=ko.observable();
var combo=ko.observableArray();
组合推送(o1);
组合推(o2);
组合推送(o3);
函数find()
{ 
var ide=document.getElementById(“vid”).value;
findandset(数字(ide),mysel);
}
函数indx()
{
var x=document.getElementById(“kam”)。selectedIndex;
警报(x);
}
函数getsel()
{ 
警报(mysel().valuee());
}
函数findandset(id,选定)
{  
var obj=ko.utils.arrayFirst(combo(),函数(项){
返回id==item.id();
});   
选定(obj);
}
findandset(1,mysel);
ko.应用绑定(组合);
挑选出来的
Sel指数
按id设置

我会在更改前添加“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();
}
for(变量i=0;i
这是否会比较itemToAdd上的所有属性?我只需要测试Id属性。这将检查两者是否完全相同。如果需要检查单个属性,那么可以使用
ko.utils.arrayFirst
。我将在答案中添加一个示例。非常好的提示,但我必须将itemToAdd.id==item.id更改为itemToAdd.id()==item.id()。我在下一个答案中发布了我的代码。@Rake36这将取决于您是否认为您的物品id会发生变化并且需要被观察。@spaceman-您有什么问题==?有样品吗?你是在比较字符串和数字还是什么?
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>
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();
}