我可以创建一个视图模型,这样一组带有收藏/非收藏类型图标的可点击 div 可以正常工作。我使用knockout来绑定css样式,设置了合适的背景图片。收藏功能是这样的:
function Favorite() {
var self = this;
self.isFavorite = ko.observable();
self.toggleMe = function(ctx) {
self = ctx;
var val = self.isFavorite();
self.isFavorite(!val);
};
self.isFavoriteClass = ko.computed(function() {
if (self.isFavorite() === true)
return 'favorite';
else
return 'notFavorite';
});
}
HTML:
<div data-bind="css: {favorite: isFavorite()==true,
notFavorite: !isFavorite() } ,
event: {click: toggleMe}"
style="border:solid red;">
</div>
plnkr:http ://plnkr.co/edit/LEwQd544rxrzhNyoyO5F?p=preview
但是,我想用 ko.viewmodel 插件达到同样的效果。(好吧,我也希望能够使用 ko.mapping :-)) ko.viewmodel 插件参考在这里:
http ://coderenaissance.github.io/knockout.viewmodel/
扩展使用 ko.viewmodel 创建的视图模型的语法非常简单。这是他们的例子:
options:{
extend:{
"{root}.users[i]": function(user){
user.isDeleted = ko.observable(false);
}
}
};
viewmodel = ko.viewmodel.fromModel(model,options));
我可以使用 ko.viewmodel 成功地将数据绑定到我的视图模型:plnkr:http ://plnkr.co/edit/afr9B8lPe1W3jCTrfH3w?p=preview
但是,当我尝试扩展视图模型以使单击切换行为也存在时,它会失败并显示以下消息:
未捕获的 ReferenceError:无法处理绑定“with: function(){return FavoritesVm}”消息:无法处理绑定“foreach: function (){return favorites()}”消息:无法处理绑定“event: function (){ return {click:toggleFavorite()} }" 消息:toggleFavorite 未定义
这是我尝试使用的选项对象:
var myOptions = {
extend:{
"{root}.favorites[i]": function(favorite){
favorite.toggleFavorite = ko.computed(function() {
debugger;
// self = this;
// var val = self.isFavorite();
// self.isFavorite(!val);
// return favorite;
var val = this.isFavorite();
this.isFavorite(!val);
return favorite;
}, this);
}
}
};
plnkr:http ://plnkr.co/edit/1gez79Q0kvPlRUYFcOfS?p=preview
注意:在 SO 上有一个与此类似的问题,关于扩展 ko.viewmodel 以在 {root} 上添加 ko.computed()。但是,我想为每个 {root}.favorite[i] 添加一个方法。请参阅 如何映射使用 ko.viewmodel 和 http://jsfiddle.net/sublimejs/L6Wm3/8/计算的字段