Javascript 使用model.set与主干关联时合并属性

Javascript 使用model.set与主干关联时合并属性,javascript,backbone.js,backbone-associations,Javascript,Backbone.js,Backbone Associations,我的问题非常特定于主干关联()。我想知道在嵌套模型上设置属性时是否可以合并属性。以下是问题的简化: // define the Layout model var Layout = Backbone.AssociatedModel.extend(); // define the User model, with layout as a Related model var User = Backbone.AssociatedModel.extend({ relations: [

我的问题非常特定于主干关联()。我想知道在嵌套模型上设置属性时是否可以合并属性。以下是问题的简化:

// define the Layout model
var Layout = Backbone.AssociatedModel.extend();

// define the User model, with layout as a Related model
var User = Backbone.AssociatedModel.extend({
    relations: [
        {
            type: Backbone.One,
            key: 'layout',
            relatedModel: Layout
        }
    ],
    defaults: {
        layout: {}
    }
});

// create a new user
var user = new User({ user_name: 'pascalpp' });

// set a property on the layout model
user.set('layout.foo', 'bar');
user.get('layout.foo'); // returns 'bar'

// call set on the user directly, passing a JSON structure with no foo property
user.set({ layout: { 'baz': 'bing' } });
user.get('layout.foo'); // foo got wiped, so this returns undefined

我面临的现实情况是,我们需要为用户获取部分数据,并在用户模型上设置这些数据,而不必删除当前获取中不存在的以前设置的属性。所以我希望我们可以在设置属性时合并。这可能吗?

如果新模型和现有模型的id匹配,主干关联将更新现有嵌套模型。如果id未定义或不匹配,则嵌套模型将替换为新模型

对于这些单例嵌套模型,我要做的是引入假id=0,然后它像预期的那样工作

这是一张工作票

工作代码:

// define the Layout model
var Layout = Backbone.AssociatedModel.extend({
    defaults: {
        id: 0    
    }
});

// define the User model, with layout as a Related model
var User = Backbone.AssociatedModel.extend({
    relations: [
        {
            type: Backbone.One,
            key: 'layout',
            relatedModel: Layout
        }
    ],
    defaults: {
        layout: {}
    }
});

// create a new user
var user = new User({ user_name: 'pascalpp' });

// set a property on the layout model
user.set('layout.foo', 'bar');
user.get('layout.foo'); // returns 'bar'

// call set on the user directly, passing a JSON structure with no foo property
user.set({ layout: { id:0, 'baz': 'bing' } });
user.get('layout.foo'); // foo got wiped, so this returns undefined

alert(user.get('layout.foo'))

啊哈!我们已经在为相关模型分配ID,但我们是在原型中完成的,而不是在默认情况下。将更新代码以使用默认值,以便将id应用于实例本身。谢谢