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