2013-03-19 8 views
5

Derwick Baileyが「A Generic Problem Solution」に記載されているアプローチをこのthreadに使用して、モデルを取得した後にビューをレンダリングしたいと考えています。モデルが取得された後にマリオネット領域をレンダリングする

MyView = Backbone.View.extend({ 
    initialize: function(){ 
    this.model.on("sync", this.render, this); 
    }, 

    render: function(){ ... } 
}); 


myModel = new MyModel({id: someId}); 
new MyView({ 
    model: myModel 
}); 

myModel.fetch(); 

私の見解は地域のレイアウトの中にあります。 Marionette.Region.show()を呼び出すと動作しますが、ビューは2回レンダリングされます。 Marionette.Region.attachView()を呼び出すと、レンダリングの関数が一度呼び出されますが、コンテンツはページに表示されません。

+0

マリオネットのリージョンとビューを使用すると、モデルが変更されるたびにビューが更新されます。したがって、ビューを一度しかレンダリングしない場合は、その領域でshowメソッドを呼び出す前にモデルをフェッチする必要があります。 – Kalpers

答えて

13

モデルは、私は少し異なるアプローチが出ているビュー


var myView = new MyView({ 
    model: myModel 
}); 

myModel.on("sync", function(){ 
    myRegion.show(myView); 
}); 

myModel.fetch(); 
4

をレンダリングする前にsync'dされるまで、あなたは待つことができます。自分のモデルを初期化するために私の見解が必要なので、Derickのアプローチは本当に私のために働いていませんでした。私がここで説明したくないいくつかの理由がありました。しかし、私はこれが来た:

私はビューのテンプレートに添付するローディングインジケータとスピナーと呼ばれるデフォルトのテンプレートを作成しました。私はupdateViewというメ​​ソッドを持っています。このメソッドは、モデルが同期して読み込みテンプレートを実際のテンプレートに置き換えた後にトリガーされ、後でrender()を呼び出します。

多分誰かがそれが役に立つと思うかもしれません。

var myView = new MyView({ 
    template: loader, 
    initialize : function(){ 
     this.model = new MyModel(); 
     this.model.on("sync", this.updateView, this); 
     this.model.fetch(); 
    }, 
    updateView : function(){ 
     this.template = myTemplate; 
     this.render(); 
    } 
}); 
+0

ええと、レンダリング段階(レンダリング、表示、アタッチのイベント間)でフェッチが完了したらどうなりますか?ビューがDOMに2回追加されたり、複数のイベントハンドラが追加されたりするような奇妙な問題はありませんか? – alekop

+0

javascriptはシングルスレッドなので、レンダリングおよびイベントバインディングは終了してから別のトリガーがトリガーされます。 – nxtwrld

関連する問題