angular.copy объекта Parse JS SDK с режимом DisableSingleInstance возвращает пустой объект
Не уверен, что это ошибка или неправильное понимание того, как все должно работать:
- отключить режим одного экземпляра
- Создайте новый объект анализа (или запросите его с сервера) и заполните свойства
- Сделайте копию объекта (например, если вы редактировали свойства формы и хотели сохранить / отменить изменения)
- Копия пуста....
используя parse-js-sdk 1.9.2 и угловой 1.4.8
//comment out the following line and it works ok
Parse.Object.disableSingleInstance();
var parseObjClass = Parse.Object.extend('Comments', {
// Instance methods
initialize: function (attrs, options) {}
},
{});
['name', 'desc'].forEach(function (item) {
Object.defineProperty(parseObjClass.prototype, item, {
get: function () {
return this.get(item);
},
set: function (aValue) {
return this.set(item, aValue);
}
});
});
var parseObj = new parseObjClass();
parseObj.name = 'Hello World'
parseObj.desc = 'Test Object'
console.log('original is ' + JSON.stringify(parseObj));
//--> original is {"name":"Hello World","desc":"Test Object"}
var objCopy = angular.copy(parseObj);
console.log('copy is ' + JSON.stringify(objCopy));
//--> copy is {}
Вот плункер, иллюстрирующий https://plnkr.co/edit/UjWe9dl6D6Qkx9ihBSMC
Справочная информация: мы используем режим disableSingleInstance, потому что у нас есть мобильное приложение и веб-приложение, которое может взаимодействовать с одними и теми же строками базы данных (данными расписания), и у нас были проблемы с js-sdk, не всегда имеющим последнюю версию данных...
1 ответ
В соответствии с angular.copy(source, [destination]);
документы:
Только перечисляемые свойства принимаются во внимание. Не перечислимые свойства (как на
source
и наdestination
) будет игнорироваться.
И в соответствии с документами MDN дляObject.defineProperty(obj, prop, descriptor)
:
При определении таких свойств по умолчанию это не перечисляемо. Поэтому вы должны указать enumerable: true
на descriptor
,
Например:
Object.defineProperty(parseObjClass.prototype, item, {
enumerable: true,
get: function () {
return this.get(item);
},
set: function (aValue) {
return this.set(item, aValue);
}
});
ОБНОВИТЬ
Просто понял, что есть проблема с вашим setter
и getter
способ, которым вы используете его, предотвращает перечисление вашей собственности. Вы можете удалить get и set и заменить на запись, и все должно быть в порядке.
Object.defineProperty(parseObjClass.prototype, item, {
enumerable: true,
writable: true
});
Если вам нужно использовать get
а также set
Вы должны использовать частную переменную или что-то промежуточное, как get: () => _props[item];