我从Ryan Niemeyer那里找到了这个例子并开始将其操作为我编写自己的代码的方式,但随后它停止了工作。谁能告诉我为什么?
备选方案1是我的变体 备选方案2基于Ryans解决方案并且确实有效(只需注释/取消注释Applybindings)。
为什么备选方案1不起作用?
我的问题在于filteredRows:
self.filteredRows = ko.dependentObservable(function() {
//build a quick index from the flags array to avoid looping for each item
var statusIndex = {};
ko.utils.arrayForEach(this.flags(), function(flag) {
statusIndex[flag] = true;
});
//return a filtered list
var result = ko.utils.arrayFilter(this.Textbatches(), function(text) {
//check for a matching genré
return ko.utils.arrayFirst(text.genre(), function(genre) {
return statusIndex[genre];
});
return false;
});
console.log("result", result);
return result;
});
我想在genre-attribute上过滤我的Textbatches(db中的字符串,从db收集的数据是字符串而不是数组/对象)
答案 0 :(得分:2)
您遇到各种各样的问题,只需检查浏览器的JavaScript控制台并阅读例外情况,即可解决大部分问题......
以下列出了您需要修复的内容:
您在声明中输入错误Textbatches
,所以正确的是self.Textbatches = ko.observableArray();
filteredRows
this
中存在范围问题。因此,如果您使用的是self
,您应该坚持使用它:
this.flags()
应为self.flags()
this.Textbatches()
应为self.Textbatches()
如果要在genre
ko.utils.arrayFirst
属性必须是数组
最后,您的Textbatch
会获取单个参数,但您使用对象调用它,因此您需要将其更改为:
Textbatch = function(data) {
var self = this;
self.id = ko.observable(data.id);
self.name = ko.observable(data.name);
self.statuses = ko.observableArray(data.status);
self.genre = ko.observableArray(data.genre);
self.createdBy = ko.observable(data.createdBy);
};
或者您当然可以更改调用位置以使用单个参数而不是对象。
这是一个包含所有上述修复的工作JSFiddle。