Объединить атрибуты при использовании model.set с базовыми ассоциациями

Моя проблема очень специфична для Backbone Associations (http://dhruvaray.github.io/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: [
 {
 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

Сценарий реального мира, с которым я сталкиваюсь, заключается в том, что нам нужно получить частичные данные для пользователя и установить его в пользовательской модели, не стирая ранее установленные атрибуты, которые не существуют в текущей выборке. Поэтому я надеюсь, что мы сможем объединиться при настройке атрибутов. Это возможно?

1 ответ

Backbone-ассоциации обновляют существующую вложенную модель, если идентификатор новой и существующей модели совпадает. Если id не определены или они не совпадают, тогда вложенная модель заменяется новой.

Что я делаю для этих одноэлементных вложенных моделей, я ввожу фальшивый id = 0, а затем он работает, как и ожидалось.

Вот работающий jsfiddle.

Рабочий код:

// 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'))

licensed under cc by-sa 3.0 with attribution.