替换使用映射插件创建的淘汰视图模型

时间:2013-06-12 07:28:23

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

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

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),它不起作用。每当我从服务器异步加载新数据时,如何替换viewmodel中的配置文件对象?

  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/

1 个答案:

答案 0 :(得分:1)

Ko映射的设计方式与此类似,因为它不希望完全呈现视图,而只是更新已更改的绑定。如果您确实希望将其更改为新的对象引用,则可以执行此类操作。请注意,保持对象的成员是一个可观察对象很重要,因为我们现在更改对象引用而不是更新同一对象上的observable。

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

我会在这里列出

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