Knockout.js 更新敲除JS映射插件中的子属性
我对淘汰js和带有层次视图模型的映射插件有问题 我的viewmodel的结构有点像这样:Knockout.js 更新敲除JS映射插件中的子属性,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我对淘汰js和带有层次视图模型的映射插件有问题 我的viewmodel的结构有点像这样: VM = { members:[ { name:"name 1", volunteering:[{...},{...},{...}] }, { name:"name 1", volunteering:[{...},{...},{...}] }
VM = {
members:[
{
name:"name 1",
volunteering:[{...},{...},{...}]
},
{
name:"name 1",
volunteering:[{...},{...},{...}]
}
]
}
每个成员都在一个选项卡中,每个选项卡都有一个志愿活动网格。点击表格中的项目会弹出一个对话框来编辑志愿活动。
此时,我克隆了该对象以方便“取消编辑”功能
var Volunteer = {};
var koContext=ko.contextFor(this);
Volunteer = ko.mapping.toJS(koContext.$data); //plain js volunteer
Volunteer.index=koContext.$parent.EventVolunteers().indexOf(koContext.$data); //index of volunteer in member volunteer array
ko.applyBindings(ko.mapping.fromJS(Volunteer),$("#dialog-EditVolunteer")[0]); //bind new volunteer obj to dialog
到目前为止,单击对话框上的“保存”似乎没有问题
var volunteer = ko.mapping.toJS(ko.contextFor(this).$data);
ko.mapping.fromJS(volunteer,{},ko.contextFor(currentTab).$data.EventVolunteers()[volunteer.index]);
此时,属性将在viewmodel中更新,但不会在主屏幕上的网格中更新
看来ko.mapping.fromJS正在替换可观察对象,而不是更新它。就个人而言,我喜欢创建这样的模型。这里的抽象更有意义
function VolunteerInfo(data){
var self = this;
self.activitiesName = ko.observable(data.name);
// any other info not all of it has to be mapped
// unless you plan on sending it back.
}
function MembersInfo(data){
var self = this;
self.name = ko.observable(data.name)// w.e it is labeled as under json
self.volunteering = ko.observableArray([]);
var mappedVolunteers = $.map(data.volunterring, function(item){
var volunteer = new VolunteerInfo(item);
return volunteer;
});
self.volunterring(mappedVolunteers);
}
function VM(){
var self = this;
self.members = ko.o
var request = $.getJSON("webservice address");
request.done(function () {
var mappedMembers = $.map(data.volunterring, function(item){
var member = new MemberInfo(item);
return member;
});
self.members(mappedMembers);
}
}
// apply bindings to VM ect ect.
我不能肯定我完全理解你在做什么 但我试图在一个项目列表中执行撤消功能,我在数组中使用了这个功能:
observableArray.replace(newData, ko.mapping.fromJS(original))
我将新数据作为click处理程序的参数获取
当我存储原件时,我基本上有:
//Dupe check
self.undoCache.Emails.pop(jQuery.grep(self.undoCache.Emails, function (element, index) { return element.Id == data.Id(); })[0]);
//Store original
self.undoCache.Emails.push(ko.mapping.toJS(data));
“电子邮件”是我正在编辑的对象。我只存储原始数据,不存储可观察数据。这让我可以使用替换。我不确定这本身有多正确,但取消对我来说是可行的。在这种情况下,我的最终解决方案是使用“克隆”视图模型中编辑的值在原始VM上设置属性
然而,对于新项目,我现在使用了一个,我希望避免这种情况,因为所讨论的对象图比这个大且更复杂,这只是其中的一部分,因此首先使用了ko.mapping插件。在这个模型中,您如何支持取消更新(基本上是我问题的根源)为什么需要克隆对象。只需将弹出窗口绑定到同一个对象。或者,如果希望能够取消更新,只需保留对原始对象的引用,然后将值从克隆对象更新为原始对象。@TomasKirda我确实需要支持取消。无论我是在“保存”还是在“取消”从克隆对象更新,我都会遇到同样的问题!