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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

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

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

提问于
用户回答回答于

一个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);
}
用户回答回答于

通过视图模型中的对象的'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是由于这是在表行循环中):

<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>

扫码关注云+社区