有没有办法阻止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;
有更好的方法吗?
答案 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.parent
和options.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);
}
}
}
};