Knockout Mapping为每个具有相同名称的属性创建调用回调

时间:2013-06-07 14:33:10

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

有没有办法阻止Knockout Mapping为模型中的每个嵌套属性应用创建回调?

以下是传递给ko.mapping.fromJS()的数据和映射示例。

var data = {
    name: 'Scott',
    level1: { 
        name : 'Alice',
        level2: {
            name: 'Tom'
        }
    }
}

var mapping = {
    name: { 
        create: function(options){
            console.log(options);
        }
    }
}

这是jsFiddle:http://jsfiddle.net/2LQut/

我希望只为顶级调用create函数,仅针对“Scott”,而不是“Alice”和“Tom”。

我发现实现此目的的唯一解决方法是将其添加到create function。

this.create = null;

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

使用“复制”选项。见这里:http://knockoutjs.com/documentation/plugins-mapping.html#copying_certain_properties_using_copy

这将是这样的:

var mapping = {
    name: { 
        create: function(options){
            console.log(options);
        }
    },
    copy: "level1"
}

答案 1 :(得分:0)

为什么不在其中执行条件逻辑,而不是停止调用create函数。

您可以访问options.parentoptions.data,只需查看您的位置即可。

这是使用购物车项目,但原理相同。

    var mapping =
    {
        'items':
        {
            create: function (options)
            {
                // does the 'item' contain a 'qty' property?
                if (options.data.hasOwnProperty('qty'))
                {
                    return new CartItemViewModel(options.data);
                }
                else 
                {
                    // it must be something else
                    return ko.mapping.fromJS(options.data);
                }
            }
        }
    };

或者你的例子

    var mapping =
    {
        'name':
        {
            create: function (options)
            {
                // does the 'parent' contain a 'level1' property?
                if (options.parent.hasOwnProperty('level1'))
                {
                    console.log('we have the name we want');

                    // map it anyway
                    return ko.mapping.fromJS(options.data);
                }
                else 
                {
                    // it must be something else to just map it normally
                    return ko.mapping.fromJS(options.data);
                }
            }
        }
    };