Как предотвратить совместное использование атрибутов клонированной модели javascript / backbone.js - PullRequest
2 голосов
/ 22 декабря 2010

Я работаю с моделями backbone.js, поэтому я не знаю, относится ли мой вопрос к тому, как магистраль обрабатывает клонирование, или это относится к javascript в целом. По сути, мне нужно клонировать модель, у которой есть свойство атрибута, назначенное объекту. Проблема в том, что когда я обновляю атрибут родителя или клона, обновляется и другая модель. Вот быстрый пример:

var A = Backbone.Model.extend({});
var a = new A({'test': {'some': 'crap'}});
var b = a.clone();

a.get('test')['some'] = 'thing';
// I could also use a.set() to set the attribute with the same result

console.log(JSON.stringify(a))
console.log(JSON.stringify(b))

, который регистрирует следующее:

{"test":{"some":"thing"}}
{"test":{"some":"thing"}}

Я бы предпочел клонировать a так, чтобы b не ссылался ни на один из его атрибутов. Любая помощь будет оценена.

Ответы [ 3 ]

2 голосов
/ 27 декабря 2010

Backdone не выполняет глубокое клонирование, а только клонирует атрибуты первого уровня. Вы должны клонировать значения самостоятельно (когда это хеш или массив для примера).

1 голос
/ 07 мая 2014
var A = Backbone.Model.extend({});
var a = new A({'test': {'some': 'stuff'}});
var b = a.clone();

b.attributes = $.extend(true, {}, b.attributes);

// try to overwrite "some" without affecting "a" model
var someStuff = {'test': {'some' : 'other stuff'}};
b.set(someStuff);

console.log(a.toJSON());
console.log(b.toJSON());

http://jsfiddle.net/RLWzm/

1 голос
/ 30 марта 2013

Вы могли бы сделать

var A = Backbone.Model.extend({});
var a = new A({'test': {'some': 'stuff'}});
var b = new A(a.model.toJSON());

Адаптировано из этого ответа: Как клонировать коллекцию магистралей

...