Javascript 如何将一个KnockoutJs可观察对象分配给另一个可观察对象?

Javascript 如何将一个KnockoutJs可观察对象分配给另一个可观察对象?,javascript,knockout.js,Javascript,Knockout.js,我的模型定义为: 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(d

我的模型定义为:

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));
}
每次我需要将一个可观测值分配给另一个可观测值时,我希望避免克隆属性。我明白,如果我设法告诉Knockout Model.Item是某个
Model.ItemList()[I]
,那么对象引用应该确保UI中的更改直接反映到我的observableArray项目,但我不能将其归类为
Model.Item=Model.ItemList()[I]Model.Item
对象和视图[*1]之间的绑定

有没有一种方法可以将一个可观察对象分配给绑定到视图的另一个可观察对象,并维护引用

如果做不到这一点,这是更好的方法吗?基本页面是一个页面,在该页面中,您将项目列表存储在observableArray中,然后在另一段HTML中添加/编辑

编辑:对[*1]的解释 我找不到stackoverflow问题的解释,但它是这样的:

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));
}

当我们做
ko.applyBindings(Model)时,模型中的可观察对象绑定到视图。此时,
Model.Item
引用的对象被绑定,因此如果我执行
Model.Item=Model.ItemList()[I]模型引用的新对象。项未绑定到任何对象。原始对象(在内存中)仍然是绑定到视图的对象,只是现在没有对它的引用。

如果将Model.Item设置为可观察对象,并将映射对象放在其中,则可以将可观察对象的内容设置为新项。knockout对可观察对象的引用保持不变,因为您只是更新内容,而不是属性本身

var TestModel = function () {
    var self = this;

    self.Item = ko.observable(ko.mapping.fromJS(new Item()));
    self.ItemList = ko.observableArray();
};

...
Model.Item(Model.ItemList()[i]);

你能解释一下为什么“我不能将其分配为Model.Item=Model.ItemList()[I];因为这会破坏原始Model.Item对象和视图之间的绑定吗?如果你将Model.Item设置为可观察的“self.Item=ko.observable(ko.mapping.fromJS(new Item())”,那么你就可以更新它的内容,而不改变绑定。“Model.Item(Model.ItemList()[i])”@JasonSpake,就是这样。给我一个答案,我就接受它=)