2017-04-24 44 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