2017-04-24 45 views
4

不知道它的一个bug或事物是如何意味着一种误解工作:angular.copy与DisableSingleInstance模式解析JS SDK对象返回空对象

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

使用解析-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

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

+0

你'parseObj'不会在登录原包含'name'或'desc' ..不知道“Parse”对象如何工作,虽然 – tanmay

+0

更新后的代码片段包含完整的“parseObjClass”代码,按照调度器 – simonberry

+0

禁用单实例意味着您可以拥有独立的对象实例,更新一个将*不*更新另一个。我觉得你的问题,你更喜欢保持单实例启用。这并不意味着整个应用程序只能有一个参考。这意味着在该服务器上,任何对具有该Id的该类的ParseObject的引用都将具有与更新相同的数据。 –

回答

3

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

只考虑枚举属性。不可枚举的属性(在sourcedestination上)都将被忽略。

而且根据MDN docs for Object.defineProperty(obj, prop, descriptor)

时默认定义这样的特性,它是不可枚举。因此,您必须在descriptor上指定enumerable: true

例如:

Object.defineProperty(parseObjClass.prototype, item, { 
    enumerable: true, 
    get: function() { 
     return this.get(item); 
    }, 
    set: function (aValue) { 
     return this.set(item, aValue); 
    } 
}); 

UPDATE

刚刚意识到有你settergetter您使用它阻止了你作为一个枚举属性的方式有问题。 你可以删除get和设置和替换一个可写,它应该没问题。

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

如果您需要使用getset你必须使用一个专用的VAR或东西中间,像get:() => _props[item];

+0

这个答案看起来非常有前途,但唉加入'enumerable:true'后仍然不起作用:[plunker](https://plnkr.co/edit/UjWe9dl6D6Qkx9ihBSMC) – simonberry

+0

@simonberry更新了我的答案 –

+0

再次,我是但是由于某种原因,如果我将“writeable:true”设置为原型定义,我甚至无法在第一位分配对象属性(即第一个console.log显示对象值为{} ) – simonberry