【问题标题】:PARSE check original object on BeforeSavePARSE 检查 BeforeSave 上的原始对象
【发布时间】:2015-11-02 09:22:09
【问题描述】:

我需要在保存之前检查原始对象以查看更改了哪些值。目前我有这个:

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

编辑2: 有没有办法获取脏值?

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

【问题讨论】:

  • 您是否检查过您的 Score 字段是否像 request.object.dirty("Score") 一样脏?
  • request.object.dirtyKeysrequest.object.dirty("Score") 都返回 undefined
  • 一定有问题,因为如果您正在更新字段,您应该看到它们被标记为脏。顺便说一句,Javascript alert 函数如何在 Cloud 上工作??
  • @MoNazemi thisalert 的样子
  • 如果没有脏字段,您的请求不会更新任何内容,您能否展示一下您的更新请求是什么样的以及您是如何进行的?

标签: parse-platform parse-cloud-code parse-javascript-sdk


【解决方案1】:

知道字段是否被修改的官方方法是调用dirty()

我的猜测是,查询该特定对象会以某种方式更新该对象在当前范围内的所有“实例”,而 dirty() 只有在查询之前调用 时才会起作用。

获取旧值和新值的一种方法是将其保存在单独的字段中。例如,您可以从您的客户端调用(伪编码,但您明白了):

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

然后在 Cloud Code 中:

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() 命令;它应该返回旧值。但是,它将使其他所有脏字段无效。

【讨论】:

  • 我不想复制这些字段,并且由于before save 日志具有原始值,我想知道是否有任何方法可以直接获取它。如果没有其他方法可以实现这一点,我会接受您的正确答案。
  • 没有 API 可以直接获取它,请参阅 answer here,但是这里的其他人使用了您的确切方法并且它有效,例如,请参阅 here。我不知道为什么它对你不起作用,也许最近 SDK 发生了一些变化。
  • 我从那个帖子中得到了我的代码。此外,由于该代码不再起作用,我想知道它是否以任何方式发生了变化。
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多