我的模型定义为:
var TestModel = function () {
var self = this;
self.Item = ko.mapping.fromJS(new Item());
self.ItemList = ko.observableArray();
};
var Model = new TestModel();
ko.applyBindings(Model);
在AJAX调用之后,我用以下内容填充数组:
ko.mapping.fromJS(data, {}, Model.ItemList);
数组显示在屏幕上,当用户选择项目时,会打开一个模态对话框来编辑该项目。可以打开相同的模态对话框以添加新项目。那个模态有一个data-bind="with: Item"
,所以我可以这样做:
function add() {
ko.mapping.fromJS(new Item(), {}, Model.Commission); //Empty object
$('#dialog').dialog('open');
};
function saveAdd() {
//Clone the properties...
Model.ItemList.push(ko.mapping.fromJS(ko.mapping.toJS(Model.Item)));
}
function edit(i) {
//Clone properties!
ko.mapping.fromJS(ko.mapping.fromJS(ko.mapping.toJS(Model.ItemList()[i])), {}, Model.Item);
$('#dialog').dialog('open');
}
function saveEdit(i) {
//Clone properties!!!!
Model.ItemList()[i] = ko.mapping.fromJS(ko.mapping.toJS(Model.Item));
}
每次我需要将一个observable的值分配给另一个observable时,我想避免克隆属性。我明白如果我设法告诉Knockout Model.Item 某些Model.ItemList()[i]
,对象引用应该确保UI中的更改直接反映到我的observableArray项目,但我不能只是将其作为Model.Item = Model.ItemList()[i];
进行分配,因为这会破坏原始Model.Item
对象与视图[* 1]之间的绑定。
有没有办法将分配一个observable绑定到另一个绑定到视图的observable,并维护引用?
没有做到这一点,这是一个更好的方法吗? Basicaly一个页面,您可以在observableArray中存储项目列表,然后在另一个HTML中添加/编辑。
我找不到解释这个问题的stackoverflow问题,但它是这样的:
当我们ko.applyBindings(Model);
时,Model
内的可观察对象会被绑定到视图中。此时Model.Item
引用的对象是绑定的,因此如果我Model.Item = Model.ItemList()[i];
Model.Item
引用的新对象没有绑定到任何内容。原始对象(在内存中)仍然是绑定到视图的对象,只是现在没有对它的引用。
答案 0 :(得分:0)
如果使Model.Item成为一个可观察的,其中包含映射的对象,那么您可以将可观察的内容设置为新项目。淘汰对观察者的引用仍然完整,因为您只是更新内容而不是属性本身。
var TestModel = function () {
var self = this;
self.Item = ko.observable(ko.mapping.fromJS(new Item()));
self.ItemList = ko.observableArray();
};
...
Model.Item(Model.ItemList()[i]);