如何将Knockout Mapping库用于需要默认值的可观察对象

时间:2012-11-06 20:31:51

标签: knockout.js knockout-mapping-plugin

现在,我可以简单地使用默认值来初始化一堆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)
};

你可以看到的是开销很大。我还想补充一点,使用映射库突显我的一个好处是,这使得在属性名称更改时可以减少一个更新位置。但是,如果确实必须明确声明属性名称以指定创建回调,那么这种好处就会失败。

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

1 个答案:

答案 0 :(得分: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/