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