我正在尝试用ko映射解决一个小问题。场景是我的ViewModel基本上是一个对象集合。每个对象都是通过json调用创建的,以这种方式:
var ViewModel = ko.observableArray();
$.getJSON(url, function(data) {
ViewModel.push(ko.mapping.fromJSON(data));
});
这很有效,我可以在HTML中做各种魔术。 问题是,例如,如果我想在我的收藏中添加一些东西,那么就说支持客户端“添加和编辑”场景。我想做点什么:
<input type="button" value="add new" data-bind="click: AddNew" />
我希望ViewModel中的AddNew函数类似于:
function AddNew() {
this.push(// WHAT HERE?);
}
基本上我需要推送一个与已经存在的对象相同的对象,当然还有所有消隐的属性......
我在想一种从列表中“克隆”一个对象并将所有可观察对象设置为空的方法,但我不知道从哪里开始我害怕:/
答案 0 :(得分:7)
如果要将功能扩展到客户端编辑/添加,那么我建议将对象形式化为js类,然后在内部映射这些对象。这将允许您在主视图模型上添加方法,并轻松地在客户端创建空白实例。
映射插件的一个警告是,为了更新对象,它希望这些对象最初是由插件映射的。这是一个如何完成它的快速示例。
var YourObjectClass = function (config) {
var self = this, data;
// your default structure goes here
data = $.extend({
name: "",
id : -1
}, config);
ko.mapping.fromJS(data, {}, self);
};
var viewModel = function(initialData) {
var self = this;
ko.mapping.fromJS(initialData, {
items: {
create : function (options) {
return new YourObjectClass(options.data);
}
}
}, self);
this.AddNew = function () {
self.items.push(new YourObjectClass());
}
};
希望这有帮助。
答案 1 :(得分:0)
您是否知道这些字段,或者您是否需要从服务器中获取这些字段?如果是这种情况,我认为你很难开始新的清单。你可以创建一个模板并推送它:
var myTemplate = {
name: ko.observable(),
phone: ko.observable()
};
ViewModel.push(myTemplate); // add empty item
我从未见过视图模型是一个可观察或可观察的数组,为什么不这样创建呢?
function ViewModel() {
self = this;
self.items = ko.observableArray();
}
var myViewModel = new ViewModel();
ko.applyBindings(myViewModel);
$.getJSON(url, function(data) {
myViewModel.items.push(ko.mapping.fromJSON(data));
});