我想要将一个新项目push
到observableArray
上,但前提是该项目不存在。在KnockoutJS中有什么“查找”功能或推荐的模式来实现这一点吗?
我注意到observableArray
上的remove
函数可以接收传入条件的函数。我几乎想要相同的功能,但只在传入的条件为真或不为真时才推送它。
发布于 2011-12-08 00:15:10
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);
}
发布于 2012-07-26 20:10:29
谢谢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;
};
在超文本标记语言中,我有以下内容($parent是因为它在一个表行循环中):
<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>
发布于 2016-09-01 22:06:04
我会在更改之前添加"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();
}
https://stackoverflow.com/questions/8417270
复制相似问题