0

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

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/

4

1 回答 1

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);
    }
};

编辑:从下面的评论 jsfiddle.net/rzFgU 中你的小提琴有很多问题

我会在这里列出它们

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