2012-03-29 4 views
1

私はBackboneの中でDeferredsを使用するためにSam Breedから読んだテクニックを使用しています。jQuery DeferredsでBackboneJsを使用する

var me = this; 

this.deferredTemplate = $.ajax({ 
    url: 'details/welcomeMaster.htm' 
}).done(function (data) { 
    me.template = data; 
}); 

これは私のViewの外部に配置された私のためのテンプレートファイルをロードします:私は、次のしている私のバックボーンViewの私initializeメソッド内

私がここに必要なときは、それを新しいものにするコードです。

var something = new Dashboard.Views.WelcomeMasterView({ 
     collection: me.collection, 
     el: $('.contentContainer') 
}); 

something.deferredTemplate.done(function (data) { 
     something.render(); 
}); 

残念ながら、私はsomethingが私のバックボーンViewなくjqXHR対象となるように、これらの2文を分割する必要があります。それ以外のこのコードはうまく動作します。

質問 上記の2つのコールを連鎖させる方法に関するアイデアはありますか? .done()メソッドの中では、私はバックボーンViewオブジェクトが必要です。

答えて

4

私はあなたが最初にテンプレートを読み込み、それを取り出した後に任意のビューを構築する方が簡単かもしれないと思っています。これは、同じものを提供しているAMDローダーでは、どのように動作するかを示しています。

render: function() { 
    this.deferredTemplate.done(this._render); 
    return this; 
}, 

これを:

それ以外の場合は、1つのアイデアは次に言う

_render: function() { 
    this.$el.html(this.template(this.model.toJSON())); 
}, 

をごrenderが通常何だろう_renderを、追加することです準備ができたら、あなたの通常のrender_renderを呼ぶだろう物事をシンプルに保つと、いつもと同じ方法でrender()に電話をかけて行くことができます。ただし、欠点に注意してください:レンダリングの呼び出しの後に実際にレンダリングすることに頼っている場合(たとえば、$elを別の場所で操作するなど)、実際にその要素が存在しない可能性があります。

遅延メモはバックボーンに最適ですが、リンク先のブログ投稿での使用は不要です。 changeへの簡単なバインドは、よりクリーンな方法で同じタスクを達成しました。

+2

私が書いた便利な記事もあります。http://lostechies.com/derickbailey/2012/02/09/asynchronously-load-html-templates-for-backbone-views/とhttp:// lostechies.com/derickbailey/2012/03/20/trafficcop-a-jquery-plugin-to-limit-ajax-requests-for-a-resource/ –

+0

@DerickBaileyあなたは、Stackoverflowのすべてのバックボーンの質問について記事を書いているようです;)私はあなたのブログを通過する必要があります! – ggozad

+4

私の記事のアイデアの半分はどこから来たと思いますか? "...この質問を見たのは5回目です。記事を書くべきです。" :D –

関連する問題