如何将KnockoutJs observable分配给另一个observable?

时间:2017-04-07 17:43:19

标签: 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(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中添加/编辑。

编辑:[* 1]

的说明

我找不到解释这个问题的stackoverflow问题,但它是这样的:

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

1 个答案:

答案 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]);