刷新时父被更新选定的可观察到的(Refreshing a selected observable w

2019-10-19 00:39发布

我以前问过这个问题,但没有得到多少响应。 很明显,我不是很清楚,我试图实现的,所以我会再试一次。

这里的的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 (或事实上任何其他选择可观察到的有可能是)当底层模型发生变化?

Answer 1:

你的问题是, ko.mapping.fromJS(model.people, this.people)清空并重新创建你的people的集合。 但你的selectedPerson仍引用旧的一个person对象。

你需要告诉映射插件,你要如何确定你的项目,因此它会更新它们:

ko.mapping.fromJS(model.people, 
                 { key: function(item) { return item.forename; } }, 
                 this.people); 

演示的jsfiddle 。

或作为一种替代解决方案您可以重置selectedPerson到新创建的一个person的映射后的对象:

this.selectedPerson(ko.utils.arrayFirst(this.people(), function(item){
        return item.forename() == this.selectedPerson().forename();
    }, this));

演示的jsfiddle 。



文章来源: Refreshing a selected observable when parent is updated
标签: knockout.js