【问题标题】:How can I utilize Knockout Mapping library for observables that need a default如何将 Knockout Mapping 库用于需要默认值的可观察对象
【发布时间】:2012-11-06 20:31:50
【问题描述】:

现在,我可以简单地初始化一堆带有默认值的 observable,比如...

self.a = ko.observable(data.A || "");
self.b = ko.observable(data.B || "");
self.c = ko.observable(data.C || "");

但如果我想做类似的事情

var ViewModel = ko.mapping.fromJS(data) 

并设置默认值,我该怎么做?

我真的必须做类似的事情吗

var ViewModel = function(data) {
   ko.mapping.fromJS(data, {
     c: {
       create: function(options) { return ko.observable(options.data.c || "") }
     };
   }, this)
};

如您所见,开销很大。我还想补充一点,映射库对我来说突出的一个好处是,当属性名称发生变化时,它可以减少一个更新的地方。但是,如果您确实必须显式声明属性名称以指定创建回调,那么该好处就被破坏了。

我错了吗?有一种简单的方法可以解决这个问题吗?

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    如果您需要为所有字段设置相同的默认值,您可以构造映射选项动态迭代所有data 的属性:

    var ViewModel = function(data) {
        var mappingOptions = {};
        for (var key in data) {
            mappingOptions[key] = {
                create: function(options) {
                    return ko.observable(options.data || "123");
                }
            };           
        }
    
        ko.mapping.fromJS(data, mappingOptions, this);
    };
    

    这是工作小提琴:http://jsfiddle.net/vyshniakov/tDAGU/

    【讨论】:

    • 谢谢阿特姆。我会把你的作为答案,即使它有限制,比如它必须适用于所有人。
    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多