Как предотвратить клонированную модель JavaScript/Backbone.js от обмена атрибутами

StackOverflow https://stackoverflow.com/questions/4506025

Вопрос

Я работаю с моделями 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"}}

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top