21

バックボーン同期メカニズムを設定していますが、モデルのIDを生成する場所が少し混乱しています。

新しいモデルを作成するとき、バックボーンがIDを生成して設定する必要がありますか、それともID生成メソッドを実装する必要がありますか、またはIDを生成するサーバーにデータを「PUT」する何らかのメカニズムがあります。 IDのモデルを返しますか?

4

3 に答える 3

56

モデルからサーバーへの実際のラウンドとIDがその役割を果たす方法など、熟考している主要なポイントを取得するために学習する必要のあるコードを単純化するための2番目の回答を提供します。

モデルを定義するとします-ジュラシックパークに行きましょう。

// Define your model
var Dinosaur = Backbone.Model.extend({
    defaults: {
        cavemanEater: undefined    // Has one property, nom nom or not.
    },
    urlRoot: 'dino'               // This urlRoot is where model can be saved or retrieved
});

var tRex = new Dinosaur({'cavemanEater':true});

これで、肉を食べる恐竜がインスタンス化されました。咆哮。

console.log(tRex);

注意すべきことは、tRexのプロパティでは、モデルにIDがないことです。代わりに、Backboneがモデルに自動的に割り当てる一時的なIDと考えることができるcIDが表示されます。モデルにIDがない場合、それは新しいと見なされます。モデルを(データベースまたはローカルストレージのいずれかに)永続化するという概念は、モデルを作成した後にそのリソースに戻り、保存(PUT)や破棄(DELETE)などを実行できるようにするものです。もう一度直接リソースを指す方法がなければ、そのリソースを見つけるのは難しいでしょう。そのリソースを見つけるために、モデルにはIDが必要です。これは、現在は持っていないものです。

したがって、上記の回答で説明されているように、バックボーンにリソースIDを提供するのはデータベース(またはローカルストレージ、またはその他のソリューション)の仕事です。ほとんどの場合、これはリソースID自体、別名、テーブル内のモデルの主キーIDから発生します。

私のセットアップでは、PHPとmySQLを使用しています。Dinosaurというテーブルがあり、各行は私の恐竜モデルの永続的な表現になります。したがって、id列(一意の自動インクリメントint)とcavemanEater(ブール値)があります。

データ通信の流れはこのようになります。

  1. モデルを作成します。
  2. モデルは新しいため、cIDのみがあります。適切なIDはありません。
  3. モデルを保存します。
  4. モデルのjson表現はサーバーに送信されます(POST)
  5. サーバーはそれをテーブルに保存し、リソースIDを与えます。
  6. サーバーはデータのjson表現を送り返します{id:uniqueID}
  7. バックボーンはこのjson表現をidで受け取ります
  8. バックボーンは、IDを使用してモデルを自動的に更新します。

注釈付きコードは次のようになります。

クライアント:

tRex.save();
// {'cavemanEater':true} is sent to my server
// It uses the urlRoot 'dino' as the URL to send. e.g. http://www.example.com/dino

サーバ:

// Is setup to accept POST requests on this specific ROUTE '/dino'
// Server parses the json into something it can work with, e.g. an associative array
// Server saves the data to the database. Our data has a new primary id of 1.
// Data is now persisted, and we use this state to get the new id of this dino.

$dinoArray = array('id'=>1, 'cavemanEater'=>true);
$dinoJSON = json_encode($dinoArray);

// Server does something to send $dinoJSON back.

クライアント:

// If successful, receives this json with id and updates your model.

これで、tRexのIDは1になります。

tRex.toJSON();
// RETURNS {'id':'1', 'cavemanEater':'true'}

おめでとうございます。これを行うと、 tRex.isNew()falseが返されます。

バックボーンはスマートです。すでにリソースIDを持つ新しいモデルとPUTモデルをPOSTすることを認識しています。

次回これを行うとき:

tRex.save();

バックボーンは次のURLにPUTリクエストを行います。

http://www.example.com/dino/1

ちなみに、これがデフォルトの動作です。ただし、URLが保存とは異なることに気付くでしょう。サーバーでは、/dinoではなく/dino /:idを受け入れるルートが必要になります

特に調整しない限り、デフォルトではモデルの/ urlRoot /:idルートパターンが使用されます。

残念ながら、恐竜は絶滅しています。

tRex.destroy();

これは電話します...あなたは推測できますか?うん。/ dino/1へのDELETEリクエスト。

バックボーンが機能するには、サーバーがさまざまなルートへのさまざまなリクエストを区別する必要があります。これを実行できるサーバー側のテクノロジはいくつかあります。

Rubyを使用している場合、誰かがSinatraについて言及しました。私が言ったように、私はPHPを使用し、SLIMPHPFrameworkを使用しています。それはシナトラに触発されているので、似ていて、私はそれが大好きです。作者はいくつかのクリーンなコードを書きます。ただし、これらのRESTfulサーバーの実装がどのように機能するかは、この説明の範囲外です。

これは、IDのない新しいバックボーンデータの基本的な完全な移動であり、インターネットを介してサーバーに送信され、そこでリソースIDが生成されて返送され、モデルをいつまでも幸せに利用できるようになります。(またはdestroy()そうではない...)

これがあなたにとってあまりにも初心者であるかどうかはわかりませんが、うまくいけば、この問題に遭遇した他の誰かを助けるでしょう。バックボーンはプログラミングするのが本当に楽しいです。

その他の同様の回答: BackboneJSモデルデータを保存する方法

于 2012-05-29T05:46:56.967 に答える
9

または、データをサーバーに「PUT」してIDを生成し、IDを持つモデルを返す何らかのメカニズムはありますか?

すこし。モデルのsaveメソッドを呼び出すと、バックボーンはPOST XHRを作成し、アプリケーションサーバーはJSONにIDが含まれていると応答する必要があります。ここで例を見ることができます:http://addyosmani.com/blog/building-backbone-js-apps-with-ruby-sinatra-mongodb-and-haml/

リンクからの引用:

post '/api/:thing' do 
  # parse the post body of the content being posted, convert to a string, insert into 
  # the collection #thing and return the ObjectId as a string for reference 
  oid = DB.collection(params[:thing]).insert(JSON.parse(request.body.read.tos)) 
  "{\"id\": \"#{oid.to_s}\"}" 
end

Rubyがわからない場合は、評価される最後の式がメソッドによって自動的に返されるものを覚えておいてください。

于 2012-05-29T01:27:47.067 に答える
4

あなたの質問から私が理解しているのは、サーバー上に存在するモデルを含むコレクションが必要だということです。これらのモデルをコレクションに取り込むには、コレクションに「fetch()」という呼び出しを追加する必要があります。

URLは「/users」などで、ユーザーデータを含むオブジェクトの配列を返す必要があります。次に、配列内の各アイテムがUserCollection.add()に渡されます。まあ、実際には一度に通過するでしょうが、あなたはポイントを取得します。

この後、コレクションにデータが入力されます。モデルのURLは、個々のモデルを更新および保存するためのものです。コレクションのURLは、モデルの作成にも使用されます。バックボーンの同期は、RubyonRailsのようにRESTfulです。実際には、RubyonRailsのドキュメントで詳細を学ぶことができます。

http://guides.rubyonrails.org/routing.html

一般的に行うことは、モデルとコントローラーのURLが異なることです。コレクションにデータを入力した後、サーバーから取得したため、モデルごとにIDがあります。

これで、ユーザー入力に基づいて新しいモデルを追加すると、次のようになります。

var HomeModel = Backbone.Model.extend({
    defaults: {
        lead: "not logged in",
    },

    url: 'test.php',

    initialize: function(){
        _.bindAll(this, 'handleSave', 'handleError');
        // Save already knows if this.isNew.
        this.save(undefined, {success: this.handleSave, error: this.handleError});
    },

    handleSave: function(model, response){
        this.model.reset(model);
    },

    handleError: function(){

    },
});

var HomeView = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this, 'render');
        this.model = new HomeModel();
        this.model.bind("change", this.render);
    },

    el: 'div',

    render: function() {    
        // Do things to render...
    }
});

var homeView = new HomeView();

例は、私が答えた他の誰かの質問からのものです。私は関連するものを追加するだけです。

一般的な考え方は、モデルの作成時にモデルを保存することです。必要に応じて、コードをモデルの関数に移動し、イベントなどに基づいて呼び出すことができます。

于 2012-05-29T00:04:41.263 に答える