如何使用Knockout Mapping插件映射到来自服务器对象的数组,并进行一些计算
How to map to an Array coming from server object using Knockout Mapping plugin and have some computed?
阅读stackoverflow中的这篇题为"如何使用模板中的Knockout Mapping插件映射到来自服务器对象的Array?"的交流(很抱歉stackoverflow限制了我的帖子链接数量)我试着利用这个答案(jsFiddle:http://jsfiddle.net/ueGAA/1)
因此,练习是在learn.klockoutjs.com上制作名为"加载和保存数据"的knockoutjs教程的todo,但使用敲除映射。
问题在于答案的视图模型声明,我喜欢它,这里转换为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.conted()的声明中,this引用了窗口。确实很正常。如果我在vewmodel变量之后声明ko.conted(),就可以获得正确的行为。
这边:
viewModel.incompleteTasks=ko.computed(function() {
return ko.utils.arrayFilter(viewModel.tasks(), function(task) { return !task.isDone() });
});
我不喜欢它,因为它静态地引用了匿名函数中的对象viewModel
问题是:如何以优雅的方式直接在视图模型声明中声明不完整的任务?jsFiddle在这里http://jsfiddle.net/Yqg8e/
感谢
从使用对象文字切换到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;
的使用,它允许访问this
上下文,即使在内部匿名函数中也是如此。
这项技术在Knockout文档中的Computed Observables部分进行了描述(跳到标题为管理'This'的部分)。
这是一个更新的小提琴:http://jsfiddle.net/Yqg8e/1/
相关文章:
- 使用jQuery计算数组中的对象以更改进度条
- 如何使用Knockout Mapping插件映射到来自服务器对象的数组,并进行一些计算
- 尝试从计算创建数组时数组长度无效
- 从JSON数组计算javascript中的日期差异
- 计算数组中的数据数量并增加javascript
- 计算 JavaScript 中数组中元素的出现次数
- 计算数组中多个对象的属性
- (角度.js)如何通过过滤器计算数组中有多少项目
- 使用 jQuery 计算文本框数组中的值
- 如何在 Javascript 中计算数组中的元素
- 从javascript数组计算平均值
- javascript 使用数组计算值
- 评估不将字符串数组计算到数组中
- 通过不同日期的数组计算日期的出现次数 |Javascript
- 使用数组计算坐标之间的距离,并设置Y轴和比例- D3.js
- 击倒可观察数组计算
- 二维数组计算金额的形式,javascript
- 如何使用Json数组计算用户在测验中回答的项目数
- 如何在Ionic框架中使用数组计算价格
- EmberJS 基于数组计算的属性不起作用