2015-11-02 72 views
2

我需要在保存前檢查原始對象,以查看哪些值已更改。目前,我有這樣的:PARSE檢查BeforeSave上的原始對象

Parse.Cloud.beforeSave("Stats", function(request, response) { 
if (!request.object.isNew()){ 
     var query = new Parse.Query("Stats"); 
     query.get(request.object.id, { 
      success: function(oldObject) { 
      alert('OLD:' + oldObject.get("Score") + "new:" + request.object.get("Score")); 
       /*Do My Stuff Here*/ 
       response.success(); 
      }, 
      error: function(oldObject, error) { 
       response.error(error.message); 
      } 
     }); 
    }else{ 
     response.success(); 
    } 

}); 

問題是oldObject等於request.object

此外,警報結果是這樣的:OLD:10 new:10,但真正的舊分數是5。另外根據之前的保存輸入日誌,原來的確是5

任何ideia我做錯了什麼?

編輯: 這是之前的保存日誌。

before_save triggered for Stats as master: 
Input: {"original":{"achievements":[],"Score":"100"updatedAt":"2015-11-02T10:09:24.170Z"},"update":{"Score":"110"}} 
Result: Update changed to {"Score":"110"} 

編輯2: 有沒有什麼辦法得到髒值?

console.log("dirty: "+ request.object.dirty("score")); 
I2015-11-03T14:23:12.198Z]dirty: true 
+0

您是否檢查過您的分數字段是否像request.object.dirty(「Score」)那樣髒? –

+0

'request.object.dirtyKeys'和'request.object.dirty(「Score」)'return'undefined' – rob180

+0

有些東西一定是錯的,因爲如果你正在更新字段,你應該看到它們被標記爲髒。順便說一句,JavaScript的'警報'功能如何在雲上工作? –

回答

1

的正式辦法知道是否被修改的字段是調用dirty()

我的猜測是,查詢該特定對象以某種方式更新當前作用域對象的所有「實例」,而這方式dirty()作品只有查詢之前稱爲

獲取舊值和新值的選項是將其保存在單獨的字段中。例如,從客戶端,你可以撥打電話(pseudocoding,但你明白了吧):

// OldScore here is 0 
statObject.put("Score") = 100; 
statObject.saveInBackground(); 

然後在雲代碼:

Parse.Cloud.beforeSave("Stats", function(request, response) { 

    var stat = request.object; 
    if (!stat.isNew()){ 
     if (stat.dirty("Score")) { 
      var newValue = stat.get("Score") // 100 
      var oldValue = stat.get("OldScore") // 0 

      // Do other stuff here 

      stat.put("OldScore", newValue); 
      response.success(); 

     } else { 
      response.success(); 
     } 
    } else { 
     response.success(); 
    } 
}); 

但是你所描述的問題是有些奇怪。也許你可以嘗試使用fetch()命令;它應該返回舊值。但它會使其他髒區域無效。

+0

我不想複製這些字段,並且由於'before save'日誌具有原始值,所以我想知道是否有任何方法可以直接獲取它。如果沒有其他辦法來實現這一點,我會接受你的答案是正確的。 – rob180

+0

沒有API可直接獲取,請參閱[答案](https:// parse。com/questions/cloudcode-haschanged-and-previous),但是其他人在這裏使用你的確切方法和它的工作,看看[這裏](http://stackoverflow.com/questions/25082262/parse-cloudcode-beforesave-獲取預先更新的對象)。我不知道爲什麼它不適合你,也許最近在SDK中有所改變。 – natario

+0

我從那篇文章中獲得了我的代碼。此外,由於該代碼不再工作,我想知道這是以任何方式改變。 – rob180