0

モデルの読み込みを簡単にしようとしています。モデルがまだ取得されていない場合は、単に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)
        });
    }

ありがとう。

4

1 に答える 1

3

load無限再帰は、メソッド呼び出しの成功コールバックthis.load、つまりそれ自体によって引き起こされます。

モデルの属性をリセットするの_.extend(this, workout)は正しい方法ではありません。workoutこれにより、のプロパティがモデル オブジェクト自体にコピーされます。あなたがしたいことは、以下attributesを使用してモデルの内部オブジェクトを更新することですModel#set:

this.set(workout);

新しいプロパティが古いプロパティをオーバーライドするだけでなく、新しいオブジェクトに存在しない以前のプロパティをクリアすることを確実にしたい場合は、次の呼び出しも行いますModel#clear

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

余談ですが、通常、バックボーン モデルを更新するには、次Model#fetchのように単純に を呼び出します。

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

残念ながら、parse.com で何がベスト プラクティスなのかわかりません。のドキュメントでParse.Object は、 fetch メソッドについて言及しているようです。

于 2013-02-26T20:06:10.013 に答える