Ошибка получения набора опорных точек после модели клона? - PullRequest
0 голосов
/ 27 июня 2018

У меня есть модель клиента, в которой немного деталей, как показано ниже

customerModel.FIRST_NAME.get('value'); // this will give some name, works fine!

Теперь, если я клонирую модель, как показано ниже

 var cloneModel = _.cloneDeep(customerModel);
 cloneModel.FIRST_NAME.get('value'); 
 // This gives  Uncaught TypeError: cloneModel.FIRST_NAME.get is not a function

Пожалуйста, посоветуйте, что мне здесь не хватает? почему магистраль get / set не работает после клона?

Заранее спасибо

1 Ответ

0 голосов
/ 27 июня 2018

Backbone get / set больше не работает после lodash _.cloneDeep, потому что _.cloneDeep копирует свойства объекта (то есть атрибутов модели), но не его прототипа. Пример ниже:

// Updating the prototype with new properties
var MyModel = Backbone.Model.extend({
  myProperty: 'foo',
  myFunc: _.noop
});
var myModel = new MyModel({value: 'someValue'});
var cloneModel = _.cloneDeep(myModel);
console.log(myModel.get);
// ƒ (e){return this.attributes[e]}
console.log(myModel.myProperty);
// 'foo'
console.log(myModel.attributes.value);
// 'someValue'
console.log(cloneModel.get);
// undefined
console.log(cloneModel.myProperty);
// undefined
console.log(cloneModel.attributes.value);
// 'someValue'

Вместо этого вы хотите использовать Функция клона Backbone.Model .

// Updating the prototype with new properties
var MyModel = Backbone.Model.extend({
  myProperty: 'foo',
  myFunc: _.noop
});
var myModel = new MyModel({value: 'someValue'});
var cloneModel = myModel.clone();
console.log(myModel.get);
// ƒ (e){return this.attributes[e]}
console.log(myModel.myProperty);
// 'foo'
console.log(myModel.attributes.value);
// 'someValue'
console.log(cloneModel.get);
// ƒ (e){return this.attributes[e]}
console.log(cloneModel.myProperty);
// 'foo'
console.log(cloneModel.attributes.value);
// 'someValue'

Это должно быть сделано в любом случае, так как даже если _.cloneDeep работает должным образом, у вас будет два экземпляра моделей с одинаковыми cid, что может вызвать проблемы с обработкой событий.

...