我以前问过这个问题,但没有得到多少响应。 很明显,我不是很清楚,我试图实现的,所以我会再试一次。
这里的的jsfiddle玩弄
我工作的一个应用程序,将(在间隔)调用Web方法,这将读取的数据库,并建立一个JSON字符串返回其用于构建我的视图模型。 当我的视图模型的变化,我需要所有的突变选择观测用新的数据。
以此为实施例下面的模型。
var model = {
people: [
{ forename: "Test", surname: "Person", numbers: [1,2,3] },
{ forename: "Another", surname: "Test", numbers: [4,5,6] }
]
};
够简单了,一桌子的人,当被点击一个模式的行会弹出显示列表numbers
中选择人都有。 虽然这种模式是开放的,数据可以被在幕后,所以如果[测试人]中选择更新(和模态弹出),并有人在什么地方增加[7,8,9]
自己的numbers
,然后我需要的模式刷新显示这些新增。
这里是(使用基本视图模型ko.mapping
为了简洁):
var viewModel = {
people: ko.mapping.fromJS(model.people),
selectedPerson: ko.observable(null),
refresh: function () {
ko.utils.arrayForEach(model.people, function (person) {
var last = person.numbers[person.numbers.length - 1];
var newNumber = last + 1;
person.numbers.push(newNumber);
});
ko.mapping.fromJS(model.people, this.people);
console.log(ko.toJSON(this));
}
};
当点击某一行上,人被存储在selectedPerson
这让我模态成为UI(我使用Zurb基金会)可见:
<div id="modal" class="reveal-modal" data-bind="if: selectedPerson">
这种模式显示的表numbers
与按钮名为Update可观察到-这调用函数来模拟改变底层模型(在这种情况下,我走在最后一项numbers
递增它由1,推动它)。 当做到这一点我再重新创建我的视图模型(使用ko.mapping
为了简洁),并期望在UI上都进行更新,以反映变化-所有罚款从模式分开。
重新映射后看我的视图模型的JSON我可以看到视图模型是否已正确更新,但selectedPerson
没有。 我认为selectedPerson
是一个参考,而不是一个副本,但我认为很明显的错误,我们结束了这一点。
{
"people": [
{
"forename": "Test",
"surname": "Person",
"numbers": [1,2,3,4,5,6,7,8]
},
{
"forename": "Another",
"surname": "Test",
"numbers": [4,5,6,7,8,9,10,11]
}
],
"selectedPerson": {
"forename": "Test",
"surname": "Person",
"numbers": [1,2,3]
}
}
所以我想我的问题是:我怎么更新selectedPerson
(或事实上任何其他选择可观察到的有可能是)当底层模型发生变化?