Javascript 如果ObservalArray数组没有与敲除JS匹配的索引,如何禁用

Javascript 如果ObservalArray数组没有与敲除JS匹配的索引,如何禁用,javascript,knockout.js,Javascript,Knockout.js,我有一个简单的模型对象和一个数组属性 例如: {name: 'Foo', tags = ['fun', 'cool', 'geek']}; 我在视图模型中将这些模型中的多个添加到obervableArray //pseudo code oa.add({name: 'Foo', tags: ['fun', 'cool', 'geek']}); oa.add({name: 'Bar', tags: ['sad', 'dorky', 'uncool']}); oa.add({name: 'Qwert

我有一个简单的模型对象和一个数组属性

例如:

{name: 'Foo', tags = ['fun', 'cool', 'geek']};
我在视图模型中将这些模型中的多个添加到
obervableArray

//pseudo code
oa.add({name: 'Foo', tags: ['fun', 'cool', 'geek']});
oa.add({name: 'Bar', tags: ['sad', 'dorky', 'uncool']});
oa.add({name: 'Qwerty', tags: ['keys', '101', 'geek']});
现在,当我根据标记筛选一个项目时,我希望显示一条消息,即不再有带有特定标记的项目

过滤代码:

// self = this;
self.filter = ko.observable('');
self.filterItems = ko.dependentObservable (function() {
    var filter = this.filter();
    if (!filter) {
        return this.items();
    } else {
        return ko.utils.arrayFilter(this.items(), function(item) {
                try {
                    if (compareAssociativeArrays(item.tags, filter)) {
                        return true;
                    }
                } catch (e) {}
                self.items.remove(item);
        });
    }
}, this);
是否可以将给定长度的项与标记值的索引进行数据绑定

更新

我确实提出了一个解决方案,但不确定是否最好。使用它,我还可以修改和检索总计:

self.hasGeek = ko.computed(function () {
    var sum = 0;
    var item;
    for (var i=0; i<self.items().length; i++) {
        var item = self.items()[i];
        if (item.tags().indexOf('geek') != -1) {
            sum++;
        }
    }
    return (sum > 0) ? true : false;
});
self.hasGeek=ko.computed(函数(){
var总和=0;
var项目;
对于(VarI=0;I0)?真:假;
});

快速将密码从我头上取下。。。过滤oa后,可能使用计算函数,可以执行以下操作:

<span data-bind="text: filterOa().length"></span>
<!-- ko: foreach filterOa -->
   <span data-bind="text: name"></span>
<!-- /ko -->
<!-- if: filterOa().length === 0 -->
    You got nothing
<!-- /ko -->

你什么都没有

我不确定您的确切结构,但我会设置一个计算的可观察对象来表示您过滤的项目。然后,您可以包含一个部分,该部分的可见性由计算的可观察过滤项的长度控制

我想:


过滤器代码添加并更新了OP的示例。本质上,我将标签视为一对多关系的组或类别。因此,用户可以对多个标签进行过滤,并且您希望能够知道标签当前是否与任何项目不匹配?是的,这是正确的。现在我正在使用一个计算函数来循环更新时的所有项目。你对问题的更新会很好。绑定是在一个计算的可观察对象中执行的,因此,您甚至可以使用一个函数,将标记作为参数进行搜索,然后将其绑定为:
visible:$root.hasTag('geek')
,或者将“geek”替换为您正在处理的指向当前标记的任何点。
Tag Filter: <input data-bind="value: tagFilter" />

<hr/>

<div data-bind="visible: !filteredItems().length">
    No items found
</div>

<ul data-bind="foreach: filteredItems">
    <li data-bind="text: name"></li>
</ul>​
var ViewModel = function() {
    this.tagFilter = ko.observable();
    this.items = ko.observableArray([
        {name: 'Foo', tags: ['fun', 'cool', 'geek']},
        {name: 'Bar', tags: ['sad', 'dorky', 'uncool']},
        {name: 'Qwerty', tags: ['keys', '101']}
    ]);

    this.filteredItems = ko.computed(function() {
        var filter = this.tagFilter();

        if (!filter) {
           return this.items();   
        }

        return ko.utils.arrayFilter(this.items(), function(item) {       
            return ko.utils.arrayFirst(item.tags, function(tag) {
                  return tag === filter;         
            });                
        });
    }, this);
};

ko.applyBindings(new ViewModel());