Knockout.Js数组过滤器语法

aib*_*rra 4 javascript knockout.js

刚进入javascript和knockout.js.我找到了一堆我想要完成的例子.我觉得我可能会忽略一个小的语法错误.我正在尝试通过ajax/json从服务器过滤已经返回的集合(this.tasks).我工作得很好.我想做的是让用户能够在完成和不完整的任务之间切换.

我将代码切换到在tasksFiltered上运行foreach循环."this.done"无论是真还是假.

任务模板

var taskModel = function(id, title, description, done){
    var self = this;
    this.id = ko.observable(id);
    this.title = ko.observable(title);
    this.description = ko.observable(description);
    this.done = ko.observable(done);

    this.showEdit = ko.observable(false);
    this.titleUpdate = ko.observable(false);
    this.descriptionUpdate = ko.observable(false);
};
Run Code Online (Sandbox Code Playgroud)

页面模型

var pageModelTasks = function(){
    var self = this;
    this.task_title = ko.observable("");
    this.task_description = ko.observable("");
        this.task_title_focus = ko.observable(true);
    this.tasks = ko.observableArray([]);

    this.tasksFiltered = ko.computed(function() {
        return ko.utils.arrayFilter(this.tasks, function(Task) {
        return Task.done == true;
      });
    });

   // CRUD functions excluded 
}; 
Run Code Online (Sandbox Code Playgroud)

这不起作用.

Vin*_*lly 10

对您的代码进行两次小修改.首先,正如@XGreen所提到的,您需要将数组值而不是 observableArray实例作为arrayFilter函数的第一个参数传递.最后,因为Task.done是可观察的,所以需要调用该成员来获取值.这是修改后的代码:

this.tasksFiltered = ko.computed(function() {
    return ko.utils.arrayFilter(this.tasks(), function(Task) {
        return Task.done() === true;
    });
});
Run Code Online (Sandbox Code Playgroud)