2015-11-02 1 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.

Любая идея, что я делаю неправильно?

Редактировать: Вот журнал сохранения до.

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"} 

Edit2: Есть ли способ, чтобы получить грязную ценность?

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 'alert' на Cloud? –

ответ

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), но другие ребята здесь, на SO, использовали ваш точный метод, и он работал, см. [здесь] (http://stackoverflow.com/questions/25082262/parse-cloudcode-beforesave- получить-предварительно обновленный-объект). Я не знаю, почему это не сработает с вами, может быть, что-то изменилось в SDK в последнее время. – natario

+0

Я получил свой код с этого поста. Кроме того, поскольку этот код больше не работал, мне было интересно, что это было каким-то образом изменено. – rob180

 Смежные вопросы

  • Нет связанных вопросов^_^