4

不确定它是一个错误还是对事物如何工作的误解:

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

使用 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的 plunker

背景:我们正在使用 disableSingleInstance 模式,因为我们有一个移动应用程序和一个 Web 应用程序,它们可以与相同的数据库行(时间表数据)进行交互,并且遇到 js-sdk 并不总是具有最新版本的数据的问题......

4

1 回答 1

3

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

只考虑可枚举的属性。不可枚举的属性( onsource和 on destination)将被忽略。

根据MDN 文档Object.defineProperty(obj, prop, descriptor)

默认情况下定义这样的属性时,它是不可枚举的。因此,您必须enumerable: truedescriptor.

例如:

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必须使用私有 var 或中间的东西,例如get: () => _props[item];

于 2017-04-27T19:48:13.843 回答