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

1 ответ

Решение

Официальный способ узнать, если поле было изменено, это позвонить dirty(),

Я предполагаю, что запрос этого конкретного объекта каким-то образом обновляет все "экземпляры" этого объекта в текущей области видимости, и это dirty() работает только если вызывается перед запросом.

Можно получить как старое, так и новое значение, чтобы сохранить его в отдельном поле. Например, с вашего клиента вы можете позвонить (псевдокодирование, но вы получите точку):

// 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() команда; он должен вернуть старое значение. Однако это сделает недействительными все остальные грязные поля.

Другие вопросы по тегам