1

多くのバックボーンの例で、mymodel.fetch()ormycollection.fetch()を使用したコードを見ましたが、ほとんどのコードは、応答からモデル/コレクションを構築するために成功コールバックを使用していませんでした。フェッチが結果からモデルインスタンスを作成する方法について何かが欠けているように私は埋めています。これはどのように起こりますか?

編集

  1. モデルが返された json と同じ構造ではなく、モデル属性をマップする必要がある場合があります。たとえば、モデル属性は「name」と「age」ですが、返される json は {n_name:'dan', props: {age: 12, address: 'this data is not related'}} です。返された json をモデルにマップする必要があります。どうすればいいですか?このような場合、成功コールバックを使用する必要がありますか?

  2. モデルには、他のモデルまたはコレクションとの関係が含まれている場合があります。たとえば、タイプ AddressModel の属性と People という人のコレクションを持つ HouseModel があります。AddressModel を構築するときにフェッチがモデルを作成し、People を構築するときに人物コレクションを作成することを望みます。どうすればいいですか?これに成功を使用する必要がありますか、それとも他の方法/回避策がありますか?

4

2 に答える 2

1

モデルのインスタンスはすでに「構築」されています。それがあなたが呼びかけfetch()ていることです。

それ以外の場合、応答 JSON を使用して、モデルのそのインスタンスの属性として各キーと値のペアを割り当てています。コレクションの場合、応答に基づいて新しいモデルを作成しています。

したがって、本質的に:

// This line instantiates a new model
var model = new MyApp.Models.ModelThing();
// This line loads the model's attributes from the database
model.fetch();

これがどのように正確に行われるかに興味がある場合は、Backbone.syncメソッドを見てください。これが実際に AJAX 要求を実行し、応答を処理するコールバックの大部分を起動します。

fetch に渡すことができる成功およびエラーのコールバックは、失敗したロードのクリーンアップや、ロードが発生したことをユーザーに通知するなどのことを行うための完全にオプションです。

于 2012-11-12T00:39:35.453 に答える
0

これはあなたがこれを得るかもしれない一例です。これは非同期メソッドであり、後で実際にモデルを使用できる唯一の方法である可能性があるため、successコールバック関数から更新されたモデルを操作して使用することをお勧めします。

var MyModel = new Todo({id: Number(item)});
MyModel.fetch({success:function(){
        var todo = new updateView({model: dModel });
        todo.render();  
}});

モデルはフェッチされたデータですでに構築されていますが、成功コールバック内で、そのデータが入力されたモデルを使用します。

編集:

最初の問題の場合:バックエンドの応答に合わせてバックボーンフェッチをカスタマイズできるように、 model.parseまたはcollection.parseのドキュメントを参照する必要があります。それを行うのはかなり簡単です:

var Collection = Backbone.Collection.extend({

    parse: function(data){return data.objects;} 

});

あなたの他の質問については、私はあなたがやろうとしていることを完全には理解していませんでした。しかし、それはかなり簡単なはずだと思います。あなたはそれを両方の方法で行うことができます。非同期フェッチのために何も得られない可能性があるため、同じ関数で(バインディングイベントと成功コールバック以外で)構築およびフェッチされたコレクションを単独で使用しようとしないでください。

于 2012-11-12T01:00:17.510 に答える