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];

Другие вопросы по тегам