【问题标题】:Replacing a knockout viewmodel created using mapping plugin with a new one将使用映射插件创建的淘汰视图模型替换为新视图模型
【发布时间】:2013-06-08 05:40:05
【问题描述】:

如何将视图模型中的整个对象(使用映射插件创建)替换为新对象(使用映射插件创建)?请注意我在视图模型中的评论...

function viewmodel(objServerModel) {
            var self = this;
            self.profile = objServerModel; //Using ko.observable(objServerModel) doesn't seem to work. I need to replace this object every time I load new content from the server and it should automatically update all controls bound to it. Note that this is the object that is created using ko.mapping.fromJS
            self.devices = ko.observableArray(['one', 'two']);

            });

下面的函数只被调用一次。从下一次开始,每当我从服务器检索新数据时,我只需要替换 self.profile 即可。 如果我使用 self.profile=ko.observable(objServerModel),它就不起作用。每当我从服务器异步加载新数据时,如何替换视图模型中的配置文件对象?

  function ApplyKnockOut() {

            var objServerModel = '@Html.Raw(HttpUtility.JavaScriptStringEncode(clsTest.ReadXmlIntoModel()))'

                var objResult = $.parseJSON(objServerModel);
                var objModelFromServer = ko.mapping.fromJS(objResult);

                var clientViewModel = new viewmodel(objModelFromServer);

                ko.applyBindings(clientViewModel);
                return clientViewModel;

            }

我将不胜感激。

谢谢

编辑:替换的映射模型结构将是相同的。只有值会有所不同。

这是我的 jsfiddle:http://jsfiddle.net/rzFgU/

【问题讨论】:

  • 这是设计使然,它只更新已更改的字段,因此只有已更改的绑定才会更新。

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


【解决方案1】:

Ko 映射是这样设计的,因为它不想完全渲染视图,而只想更新已更改的绑定。如果您真的非常希望将其更改为新的对象引用,则可以执行此类操作。请注意,持有对象的成员是可观察对象很重要,因为我们现在更改对象引用而不是更新同一对象上的可观察对象。

http://jsfiddle.net/N56FR/

ViewModel = function(data) {
    this.complex = ko.observable(); //Important
    this.map(data);
};

ViewModel.prototype = {
    map: function(data) {
        var mapping = {
            complex: {
                update: function(options) {
                    return ko.mapping.fromJS(options.data);
                }
            }
        };
        ko.mapping.fromJS(data, mapping, this);
    }
};

编辑:您的小提琴存在一些问题,来自 cmets jsfiddle.net/rzFgU

我会在这里列出来

  • 你说 observable 不起作用(它是小提琴代码中的注释),那是因为你在做 objectcreatedusingmapping.firstName,你不能访问这样的 observable 上的属性。在输入元素周围使用 with 绑定,然后直接访问 firstName。或者做 objectcreatedusingmapping().firstName。第一个解决方案更清洁。
  • ReplaceModel 正在丢失,因此您无法执行 data-bind="click: ReplaceModel" 将函数移至模型,或执行 data-bind="click: window.ReplaceModel"。第一个解决方案更清洁
  • 您甚至没有使用您的 PersonViewModel,您正在创建一个,然后将其作为参数发送到 fromJS 函数,这意味着它将被一个动态创建的对象替换。

【讨论】:

  • 这对我来说看起来很复杂。视图模型内部的复杂内部地图。你能在这个小提琴上更新它吗:jsfiddle.net/rzFgU
  • 1.) 当我将其更改为 observable 时,我也将绑定更改为 firstname()。
  • 对不起,我尝试了 firstname(),而不是 viewmodel().firstname。我还在尝试一些东西
  • 改用'with'绑定,它更干净
  • 带绑定对我不起作用。它甚至不会在文本框中显示“just”。我需要用从服务器检索到的全新副本替换视图模型中的现有对象
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2013-01-15
相关资源
最近更新 更多