首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何有条件地推送可观察数组中的项?

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

Stack Overflow用户
提问于 2011-12-07 22:51:42
回答 3查看 76.5K关注 0票数 103

我想要将一个新项目pushobservableArray上,但前提是该项目不存在。在KnockoutJS中有什么“查找”功能或推荐的模式来实现这一点吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-08 00:15:10

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

代码语言:javascript
复制
if (myObservableArray.indexOf(itemToAdd) < 0) {
  myObservableArray.push(itemToAdd);
}

如果这两者实际上不是对同一对象的引用,并且您希望运行自定义比较逻辑,则可以使用ko.utils.arrayFirst,如下所示:

代码语言:javascript
复制
var match = ko.utils.arrayFirst(myObservableArray(), function(item) {
    return itemToAdd.id === item.id;
});

if (!match) {
  myObservableArray.push(itemToAdd);
}
票数 223
EN

Stack Overflow用户

发布于 2012-07-26 20:10:29

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

代码语言:javascript
复制
    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是因为它在一个表行循环中):

代码语言:javascript
复制
<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>
票数 11
EN

Stack Overflow用户

发布于 2016-09-01 22:06:04

我会在更改之前添加"valueWillMutate()“,在更改之后添加"valueHasMutated()”。

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8417270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档