具有DisableSingleInstance模式的Parse JS SDK对象的angular.copy返回空对象

时间:2017-04-24 07:26:29

标签: angularjs parse-platform parse-javascript-sdk

不确定这是一个错误还是对事情如何起作用的误解:

  • 禁用单一实例模式
  • 创建一个新的解析对象(或从服务器查询一个)并填充属性
  • 制作对象的副本(例如,如果您正在编辑表单上的属性并希望选择保存/放弃更改)
  • 复制为空....

使用parse-js-sdk 1.9.2和angular 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模式,因为我们有一个移动应用程序和一个可以与相同数据库行交互的Web应用程序(时间表数据),并且js-sdk遇到问题并不总是拥有最新版本的数据...

1 个答案:

答案 0 :(得分:3)

根据angular.copy(source, [destination]); docs

  

仅考虑可枚举的属性。不可枚举的属性(sourcedestination)将被忽略。

根据MDN docs for 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并替换为writable,它应该没问题。

Object.defineProperty(parseObjClass.prototype, item, {
    enumerable: true,
    writable: true
});

如果您需要使用getset,则必须使用私有var或其他内容,例如get: () => _props[item];