KnockoutJS在隐藏页面上更新ViewModel

时间:2013-11-05 06:47:39

标签: knockout.js knockout-2.0 knockout-mapping-plugin

我有我的索引页面,其中显示了一个项目列表。索引页面是可观察的。我单击列表中的记录以加载用户可以修改数据的详细信息页面。我可以使用jQuery ajax成功地将修改发布到服务器,并且我返回了更新的记录,因此我可以更新索引页面上的列表。我无法弄清楚如何使用将更新发布到服务器的结果更新索引页面的下划线数据。我已经尝试实例化一个新的IndexViewModel,但UI并不反映新模型。我尝试过ko.mapping.fromJS(sourceData,targetObservableViewModel),但索引页面的UI不会更新。如何在完全不同的页面上从成功的ajax提交更新索引页面的基础数据?

        ApplicationUtils.AjaxRequestSendData
    (
        'POST',
        saveUrl,
        dataModel,
        function (jsonFromServer)
        {
            updateViewModel(jsonFromServer, self.activeGamesList);
            history.back();
        },
        function (resultsFromServer)
        {
            alert('errror happened.  not sure what happened though.');
        }           
    );

var updateViewModel = function (sourceData, targetObservableViewModel){
ko.mapping.fromJS(sourceData, targetObservableViewModel);};

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我会发表评论而不是回答,要求提供有关其他技术的更多详细信息,但还没有足够的代表:(

在这种情况下,您可以使用两种解决方案:

  1. 简单但价格昂贵:当您的viewmodel加载时,首先要做的是删除现有数据并从服务器查询新数据。

  2. 使另一个javascript对象保存您的数据并通过不同的视图模型传递它。在这种情况下,不是在服务器上来回查找新数据,而是视图模型只保存指向数据的指针,在保存时,你会告诉javascript对象来处理你的保存/重新加载。一旦数据发生变化,您的其他视图模型将立即“看到”更改,因为它包含指向该数据的指针。

  3. 第二个选项基于Hot Towel SPA模板中提供的非常简单有效的解决方案 - 如果可以的话,我建议你检查一下,看看你是否可以使用它。

答案 1 :(得分:1)

ko.mapping.fromJS可以使用3个参数...并且要使用第3个参数,您必须提供第二个参数。您所展示的是您希望使用targetObservableViewModel映射配置映射现有的sourceData。应该使用此语句返回的是映射对象...但是您不会将其分配给任何内容。如果希望targetObservableViewModel成为此映射的目标,则需要滑入第二个参数。如果您没有要引用的映射配置,只需使用{} ...一个空对象...

ko.mapping.fromJS(sourceData, {}, targetObservableViewModel)