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