Javascript 如何使用Knockout映射插件映射到来自服务器对象的数组,并进行一些计算?

Javascript 如何使用Knockout映射插件映射到来自服务器对象的数组,并进行一些计算?,javascript,knockout.js,knockout-mapping-plugin,computed-values,Javascript,Knockout.js,Knockout Mapping Plugin,Computed Values,在stackoverflow中阅读这篇题为“如何使用模板中的敲除映射插件映射到来自服务器对象的数组?”(很抱歉,stackoverflow限制了文章的链接数量) 我试图利用这个答案玩游戏(jsFiddle:) 因此,练习的目的是在learn.knockoutjs.com上将knockoutjs教程的todo命名为“加载和保存数据”,但使用knockout映射 问题在于答案的viewmodel声明类型,我喜欢,这里转换为todo: var viewModel = { tasks : ko

在stackoverflow中阅读这篇题为“如何使用模板中的敲除映射插件映射到来自服务器对象的数组?”(很抱歉,stackoverflow限制了文章的链接数量) 我试图利用这个答案玩游戏(jsFiddle:)

因此,练习的目的是在learn.knockoutjs.com上将knockoutjs教程的todo命名为“加载和保存数据”,但使用knockout映射

问题在于答案的viewmodel声明类型,我喜欢,这里转换为todo:

var viewModel = 
{
    tasks : ko.mapping.fromJS(data),
    newTaskText: ko.observable(),
    incompleteTasks: ko.computed(function() {     
           return ko.utils.arrayFilter(this.tasks(), function(task) { return !task.isDone() });
    }),
    // Operations
    addTask:  function() {
        alert('Entering add task, count:' + this.tasks().length);
        this.tasks.push(new Task({ title: this.newTaskText() }));
        this.newTaskText("");
    },
    removeTask: function(task) { this.tasks.remove(task) }

}
要点是:在ko.computed()的声明中,这个引用了窗口。 确实正常。 如果在vewmodel变量之后声明ko.computed(),则可以获得正确的行为

这样:

viewModel.incompleteTasks=ko.computed(function() {
    return ko.utils.arrayFilter(viewModel.tasks(), function(task) { return !task.isDone() });
});
我不喜欢它,因为它静态引用匿名函数中的对象viewModel。
问题是:如何以优雅的方式直接在viewmodel声明中声明未完成的任务? JSFIDLE在这里


感谢您将ViewModel从使用对象文字转换为构造函数

function ViewModel() {
    var self = this;

    self.tasks = ko.mapping.fromJS(data);
    self.newTaskText = ko.observable();
    self.incompleteTasks = ko.computed(function() {       
        return ko.utils.arrayFilter(self.tasks(), function(task) { 
            return !task.isDone()
        });
    });
    self.addTask = function() {
       alert('Entering add task, count:' + self.tasks().length);
       self.tasks.push(new Task({ title: self.newTaskText() }));
       self.newTaskText("");
    };
    self.removeTask = function(task) { self.tasks.remove(task) }
}

ko.applyBindings(new ViewModel());​
还应注意使用
var self=this
允许访问
上下文,即使在内部匿名函数中也是如此

此技术在淘汰文档中的一节中进行了描述(请跳到标题为管理“此”
的一节)


这是最新的小提琴:

好的,谢谢。这就是我这篇文章的目的,我的意思是声明一个对象文字;-)我在看代码时得到了另一个答案。事实上,computed是一个dependenttobservable,因此我们可以在匿名中传递应该是“this”的对象<代码>viewModel.incompleteTasks=ko.computed(函数(){return ko.utils.arrayFilter(this.tasks(),函数(task){return!task.isDone()};},viewModel)最后我不喜欢它,我需要像你建议的那样习惯构造函数和self技巧。感谢您提供rtfm指针;-)