2012-03-29 27 views
1

使用BackboneJs我使用的技術,我從Sam Breed閱讀關於使用主幹內Deferreds。使用jQuery Deferreds

裏面我的我的骨幹initialize方法View我有以下幾點:

var me = this; 

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

這將加載一個模板文件對我來說是外部定位到我的View

後來,當我需要它這裏是代碼,新起來。

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

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

不幸的是我要分手的2個語句,以便something是我的骨幹View而不是jqXHR對象。除此之外,這段代碼工作得很好。

問題 有關如何將上述2個調用鏈接在一起的任何想法?在.done()方法中,我需要Backbone View對象。

回答

4

我認爲,如果你想保持它的簡單,你可能更願意先加載模板,然後構建任何意見,一旦你已經賺得了他們。這就是說AMD的裝載機提供的是同樣的事情。

否則,一個想法是添加一個_render,會做什麼你render一般不會,說

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

然後,你的正常render會打電話_render準備時:

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

這會使事情變得簡單,您可以繼續使用與您一樣的方式致電render()。注意缺點:如果你依靠在渲染後實際渲染(比如說你在別的地方操縱$el),那麼你可能實際上並沒有元素。

作爲一個側面說明,而deferreds是骨幹完美契合,他們在博客中鏈接到的使用是不必要的。對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/ – 2012-03-29 20:21:18

+0

@DerickBailey你似乎已經寫了計算器上每骨幹問題的文章;)我需要通過你的博客! – ggozad 2012-03-29 20:23:04

+4

你認爲我的文章創意的一半來自哪裏? 「......第五次看到這個問題,我應該寫一篇文章。」 :D – 2012-03-29 20:51:56

相關問題