2

有没有办法阻止 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 函数中。

this.create = null;

有一个更好的方法吗?

4

2 回答 2

1

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

那将是这样的:

var mapping = {
    name: { 
        create: function(options){
            console.log(options);
        }
    },
    copy: "level1"
}
于 2013-06-28T09:31:44.000 回答
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);
                }
            }
        }
    };
于 2014-05-02T23:13:32.453 回答