用获取的Backbone模型替换'this'的Backbone模型实例

时间:2013-02-26 19:51:15

标签: javascript backbone.js underscore.js parse-platform

我正在努力让我的模型更轻松。如果尚未获取模型,它只使用id字段并自行获取。然后,我使用_.extend(this, fetchedModel)更新this。问题是,当我尝试将此获取和扩展模型设置为另一个模型中的属性时,我正在遇到循环活动 - othermodel.set("fetchedModel", fetchedModel)

是否有另一种方法来获取我的模型并简单地用刚刚获取的内容覆盖this的整个当前实例?

这是我的上下文代码(我也在使用Parse):

load : function(success) {
    debug("Loading workout...");

    // if it's not grabbed, grab it
    if(!this.createdAt) {
        var q = new Parse.Query(Workout);
        q.include("user");
        return q.get(this.id, {
            success : function(workout) {
                _.extend(this, workout);
                this.load(success);
            }.bind(this)
        });
    }

感谢。

1 个答案:

答案 0 :(得分:3)

无限递归是由调用load的方法this.load中的成功回调引起的,即本身。

要重置模型的属性,_.extend(this, workout)不是正确的方法。这会将workout的属性复制到模型对象本身。您要做的是使用Model#set更新模型的内部attributes对象:

this.set(workout);

如果要确保新属性不仅覆盖旧属性,还要清除新对象中不存在的任何先前属性,还要调用Model#clear

this.clear();
this.set(workout);

顺便说一下,通常更新Backbone模型,你只需调用Model#fetch,就像这样:

this.fetch({
  success: function() {
    //model has been updated...
  }
});

唉,我不知道parse.com的最佳做法是什么。 Parse.Object seems to mention the fetch method的文档。