2016-10-28 7 views
1

新しいモデルを作成するときに、コレクションのcreate関数を呼び出した後、バックボーンコレクションを再取得する方法を教えてもらえますか?コレクションの作成後にバックボーンコレクションを取り戻すにはどうすればいいですか?

新しいモデルを作成した後でfetchをマイコレクションに呼び出すと、そのモデルが表示されることがあります。

私の問題は、コレクションに新しいモデルを作成したときに、モデルのIDを取得できず、すぐに更新できない場合、ページを更新してIDを取得する必要があります作成されたモデルの

私はlistenToで試しましたが、私は1つの機能に多くのコレクションを送る必要があるため、使用できません。

私のブートストラップ・モーダル・ビューは、私のモデルを作成してデータベースに保存しています。モデルID以外のすべての属性はコンソールに作成しています。

バックボーンビュー:ここ

app.types.EditView = Backbone.View.extend({ 

    tagName: "div", 

    $container: $('#containerEdit'), 
    template: _.template($('#itemEdit-template').html()), 

    events: 
    { 
      "click .save": "save", 
    }, 

    initialize: function(options) 
    { 
      this.options = options; 

      this.$container.html(this.render()); 

      this.start(); 
      this.end(); 
    }, 

    render: function() 
    { 
      this.$el.html(this.template()); 
      return this.$el; 
    }, 

    save: function() 
    { 
      console.log("save"); 
      $('#openModal').modal('hide'); 
      var dan = this.model.dan_u_tjednu_usera.datum; 
      var mjesec = this.model.dan_u_tjednu_usera.mjesecBrojevi; 
      var godina = this.model.dan_u_tjednu_usera.godina; 
      var start = $("#start").val(); 
      var end = $("#end").val(); 
      var user_id = this.model.user.id; 

      this.model.shifts.create({day: dan, month: mjesec, year: godina, time_from: start, time_to: end, user_id: user_id}); 
      this.options.model.el.html($("<td href='#openModal' width='25%' align='center' class='list-group test' scope='row'>" + start + " - " + end + " " + "Admin" + "</td>")); 
      this.model.shifts.fetch({sync: true}); 
      console.log("test", this.model.shifts); 

    } 

あなたは私の応答イムで作成した上で、id属性を取得していないことがわかります。

enter image description here

そして、ここで私は私のコレクションを記録し、私はここで作成したモデルのid属性を持っていない私のセルをクリックしたときには見ることができます。 IMは私がログインしたときにidはあまりにもそれを属性得ていないthis.model

enter image description here

答えて

1

これは、あなたがCollection.createが非同期で呼び出してサーバーに送信された要求は、Javascriptのコードは、サーバーの前に実行していきますされているため、要求を受信し応答する。

サーバーから戻ってくるIDでモデルを更新する場合は、Collection.create呼び出しで{wait: true}を指定できます。これは、コレクションがでなく、モデルがすぐに追加されることを意味しますが、サーバーが応答したときにのみ(正常に)呼び出されます。

この場合、ではなくを実行すると、作成操作が完了するまで待つ必要があるため、すぐにfetchを実行する必要があります。作成操作が完了したときにトリガーする以下のアクションを設定する必要があります。コレクション内のモデルの新しいインスタンスを作成するために

var model = collection.create({field: 'abc'}, {wait: true}); 
model.once('sync', function() { window.alert(model.id); }); 
+0

私は、作成したモデルのIDを取得していないよ '私は' console.log'を試してみましたが、解雇でもない解雇はないwindow.alert'。私はモデルを作成するとき私は私のIDでデータベース内のモデルを持っていますが、私は私のコレクションをログに私はidなしのモデルを取得コンソールログ。 – lorenos

+0

サービスコールは新しい属性を返しますか? – mikeapr4

+0

はい、新しいアトリビュートをコンソールに表示しますが、新しいモデルのIDは表示されません。私はそれを取得して2回を取得するが、私は2度フェッチしません私はそれを一度フェッチし、または可能であれば同期メソッドでそれを行う。 – lorenos

1

Backbone's create

利便性:ここでは一例です。 属性のハッシュを使用してモデルをインスタンス化し、 モデルをサーバーに保存し、 が正常に作成された後にそのモデルをセットに追加するのと同じです。

作成した後にコレクションをフェッチする必要はありません、モデルidおよび他のフィールドは、自動的にそのattributesハッシュの中にマージされます。

mikeapr4が間違っていないですが、彼の例を向上させることができ

モデル作成後に取り出します。

{ wait: true }は不要の場合は、コレクション内のモデルからではなく、フェッチからの唯一の問題です。

また、onceは「古い」方法では避けてください。代わりにlistenToOnceを使用してください。 Difference between ListenTo and onを参照してください。

あなたが本当に一度モデルが作成されたフェッチしたい場合は、イベントを使用して過剰ここで、その代わりに、成功コールバックを使用することが最善である:

save: function() { 
    // ..snip... 
    this.model.shifts.create({ /* ...snip... */ }, { 
     context: this, 
     success: this.onModelCreated 
    }); 
}, 

onModelCreated: function() { 
    // the model is now created and its attributes are up-to-date 
    this.model.shifts.fetch(); 
} 

その他の注意事項あなたのコードに

ありますバックボーンにはsyncオプションはありません。 "sync"イベントとsync機能のみ。


グローバルjQueryのセレクタの使用を避ける($('.class-name')など)の代わりに、要素がビューの要素の範囲内であるときはいつでも、this.$('.class-name')を使用します。

また、findメソッドの高価な検索を避けるために、jQuery要素をキャッシュします。

のように、$("#start")はキャッシュして再利用できます。再レンダリングするときにのみ、キャッシュされた要素をリセットします。


バックボーン.render機能は、慣例によりthisを返す必要があります。

次に、あなたのレンダリング呼び出しは次のようになります。

this.$container.html(this.render().el); // el is enough 
+0

「listenToOnce」についての良い点ですが、使用することをお勧めします'{wait:true}'が有効な場合は、モデルが有効である(つまりIDを持つ)までコレクションに追加されないことを意味します。同じアプリケーションの他の部分がある場合には修正の一部でなければなりませんコレクションを使用し、潜在的にそれから '追加'イベントに反応します。 – mikeapr4

+0

@ mikeapr4特定のバリデーションがサーバー側からのみ利用可能な場合は、**エラー**のモデルを削除してください。これは、あなたのアプリをより敏感に感じさせる**アクションの間の待ち時間がない**です。それは[マルチプレイの補間](http://www.gabrielgambetta.com/fpm3.html)ゲームのようなものです。 –

+0

質問から分かるように、IDのないモデルではアプリケーションが正しく動作しないため、使用するために準備が整うまで待つのが得策です。たとえば、モデルが後でアクション(編集/削除など)のIDを含むリンクでレンダリングされる場合があります。しかし、我々はこのアプリケーションがどのように動作するかについて、どちらも仮定しています。 – mikeapr4

関連する問題