Javascript 如何使复选框与敲除一起工作

Javascript 如何使复选框与敲除一起工作,javascript,checkbox,knockout.js,Javascript,Checkbox,Knockout.js,我从Ryan Niemeyer那里找到了这个示例,并开始按照我自己编写代码的方式来操作它,但后来它停止了工作。有人能告诉我为什么吗 备选方案1是我的变体 备选方案2基于Ryans解决方案,确实有效(只需注释/取消注释Applybindings) 为什么备选方案1不起作用 我的问题是filteredRows: self.filteredRows = ko.dependentObservable(function() { //build a quick index from the flag

我从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;

});
我想根据类型属性过滤我的TextBatch(db中的字符串,从db收集的数据是字符串,而不是数组/对象)


在这里摆弄:

您有各种各样的问题,大多数问题都可以通过检查浏览器的JavaScript控制台并读取异常来解决

下面是您需要修复的列表:

  • 您在声明中未键入
    Textbatches
    ,因此正确的是
    self.Textbatches=ko.observearray()

  • 您在
    filteredRows
    中使用
    this
    时存在范围问题。因此,如果您使用的是
    self
    ,您应该坚持使用它:

    • this.flags()
      应该是
      self.flags()
    • this.Textbatches()
      应该是
      self.Textbatches()
  • 如果要在
    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);  
    };
    
    当然,您也可以将调用位置更改为使用单个参数而不是对象


这是一份包含上述所有修复的工作。

谢谢,@nemesv。我想我有点匆忙。(humble pie,himblepie)然而,我的大问题(我想)是,制作一个数组并不适合我的解决方案。那么除了“ko.utils.arrayFirst”之外,我还有哪些选择呢?如果你不需要一个数组作为流派,就不要使用数组,删除
ko.utils.arrayFirst
,只返回
statusIndex[text.Genre()]
参见:那么“return statusIndex[text.Genre()]”会向arrayFilter返回true/false,这就是过滤数组的方法,对吗?如果从
arrayFilter
返回true,则会包括该项。你可以在这里阅读更多关于KO数组助手的信息:Thanx很多,nemesv!:)