如何使复选框与淘汰赛一起使用

时间:2014-11-10 14:43:54

标签: javascript checkbox knockout.js

我从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收集的数据是字符串而不是数组/对象)

在这里小提琴:http://jsfiddle.net/gsey786h/6/

1 个答案:

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