Knockout.js 敲除从自动映射的observable创建空对象
我正在尝试用ko映射解决一个小问题。场景是我的ViewModel基本上是一组对象。每个对象都是通过json调用创建的,方式如下:Knockout.js 敲除从自动映射的observable创建空对象,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我正在尝试用ko映射解决一个小问题。场景是我的ViewModel基本上是一组对象。每个对象都是通过json调用创建的,方式如下: var ViewModel = ko.observableArray(); $.getJSON(url, function(data) { ViewModel.push(ko.mapping.fromJSON(data)); }); 这是完美的,我可以在我的HTML中做各种各样的魔术。 问题是,例如,我是否想向我的集合中添加一些内容,比如说支持客户端“添加
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" />
function AddNew() {
this.push(// WHAT HERE?);
}
基本上,我需要推一个与其他已经存在的对象相同的对象,但是当然,所有的属性都是空白的
我正在考虑一种从列表中“克隆”一个对象并将所有可观察对象设置为空的方法,但我不知道从哪里开始。我担心://如果您要将功能扩展到客户端编辑/添加,那么我建议将您的对象形式化为js类,然后在内部映射这些对象。这将允许您在主viewmodel上添加方法,并在客户端轻松创建空白实例
映射插件的一个警告是,对于更新对象,它希望这些对象最初是由插件映射的。下面是一个如何实现的快速示例
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());
}
};
希望这对您有所帮助。您知道这些字段吗,还是需要从服务器上获取的内容复制这些字段?如果是这样的话,我想你会很难开始一份新的清单。您可以创建一个模板并推送它:
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));
});
第二种方法是我正在做的。我不清楚抱歉,但我的意思是虚拟机只包含一个集合,我完全像那样填充它。你是对的,我知道单个项目的属性,但我使用自动映射来避免为它们创建模板的麻烦。如果这是唯一的方法,那也没问题,但我想知道ko或mapping(或JavaScript本身)是否提供了某种从以前存在的对象“更新”对象的方式(可能是探索元数据?克隆?)。“映射插件的一个警告是,对于更新对象,它希望这些对象最初由插件映射。这是一个如何做到这一点的快速例子。”-如果我早知道这一点,我会节省很多时间!