使用Backbone構建精美應用的7條建議
我們在Bizzabo使用Backbone.js已經有兩年的時間了。我們從一個小的網頁應用為開始,這些小應用是由Backbone驅動的,而且他們看上去非常友好。
Backbone天生就不固執己見。你從文件上獲取的一個最基本觀點是:使用backbone.js提供的工具,做任何你想做的事。
這點非常好,因為有這麼多不同的應用場合,而且對於開始寫app來說也非常容易。這種途徑可能避免我們在剛開始時犯儘可能少的錯誤。
當一件事做錯的時錯,我們要發現並找到改正的方法。
下面這些提示,可以讓你避免我們在進行Backbone.js開發時所碰到錯誤:
1. 檢視(Views)是資料無關的(Data-Less)
資料屬於模型(models)不是檢視。下次你發現 你在一個檢視中儲存資料(或者更糟:在DOM裡),馬上把它移到model裡。
如果你沒有model,建立一個非常簡單:
this.viewState = new Backbone.Model();
真的不需要任何其它操作。
你可以在你的資料上偵聽改變事件,甚至跟你的伺服器線上同步。
2. DOM事件只改變models
當一個DOM事件觸發時,比如點選了一個按鈕,不要讓它改變view本身。改變這個model.
改變DOM且不改變狀態意味著你的狀態還儲存在DOM中。這條規則可以讓你保持狀態一致。
如果點選了一個“載入更多”邊接,不要展開檢視,只需要改變model:
this.viewState.set('readMore', true);
好了,但是檢視何時發生改變?好問題,下一條規則會回答。
3.DOM只有在model發生改變時才改變
事件是很神奇的,請使用他們。最簡單的方法是每次改變後觸發一遍。
this.listenTo(this.stateModel, 'change', this.render);
更好的方法是隻有在需要的時侯觸發改變。
this.listenTo(this.stateModel, 'change:readMore', this.renderReadMore);
這個檢視會一直同他的model保持一致。無論model是如何改變的:從命令介面或除錯資訊處響應動作,這個檢視會一直保持更新。
4. 繫結的東西必須解綁
當檢視從DOM上移除時,使用'remove'方法,它必須從所有繫結的事件上解綁上。
如果你使用'on'繫結,你的職責是使用'off'去解綁。如果沒有解綁,記憶體回收器無法釋放記憶體,從而造成你應用的效能下降。
這就是'listenTo'的由來。它會跟蹤檢視的繫結和解綁。Backbone把這個從DOM移動之前,會進行'stopListening'。
// Ok: this.stateModel.on('change:readMore', this.renderReadMore, this); // 神奇: this.listenTo(this.stateModel, 'change:readMore', this.renderReadMore);
5. 保持鏈式寫法
從render和remove方法裡,總是返回'this'。這樣可以讓你寫方法鏈。
view.render().$el.appendTo(otherElement);
這很方法,不要打破它。
6. 事件比回撥要好
等待響應事件比回撥要好
Backbone模型(models)預設會觸發'sync'和'error'事件,因此可以使用這些事件代替回撥。考慮一下這兩種情況。
model.fetch({ success: handleSuccess, error: handleError }); //這種更好: view.listenTo(model, 'sync', handleSuccess); view.listenTo(model, 'error', handleError); model.fetch();
model何時填充(fetched)並不重要,handleSucess/handleError會被呼叫。
7. Views是有作用域的
檢視永遠不要操作除了它本身以外的DOM。
view會引用它自己的DOM元素,如'el'或者jquery物件'$el'
那意味著你永遠不要直接使用jQuery:
$('.text').html('Thank you');
請把DOM元素的選擇限定到你自己的域裡面:
this.$('.text').html('Thank you'); // 這等價於 // this.$el.find('.text').html('Thank you');
如果你需要更新一個別的不同的檢視,只要觸發一個事件,讓別的檢視去做。你也可以使用Backbone的全域性Pub/Sub系統。
例如,我們阻止頁面滾動:
var BodyView = Backbone.View.extend({ initialize: function() { this.listenTo(Backbone, 'prevent-scroll', this.preventScroll); }, preventScroll: function(prevent) { // .prevent-scroll 有下面的CSS規則: overflow: hidden; this.$el.toggleClass('prevent-scroll', prevent); } }); // 現在從任何其他地方呼叫: Backbone.trigger('prevent-scroll', true); // 阻止 scrolling Backbone.trigger('prevent-scroll', false); // 允許 scrolling
還有一件事
只要讀讀backbone的原始碼,你會學到更多。看一看backbone.js的原始碼,然後看看這些神奇的事情是怎麼實現的。這個庫非常小,而且可讀性很好,整個讀完不會超過10分鐘的。
這些小貼士幫助我們寫乾淨的,更好的可讀的程式碼。
相關文章
- 【譯文】構建大型 Redux 應用的五個建議Redux
- 高效設計構建軟體的十三條建議
- 使用 webpack 構建應用Web
- Android 優化APP 構建速度的17條建議Android優化APP
- Android 優化 APP 構建速度的 17 條建議Android優化APP
- 使用汽車應用庫構建應用
- 構建高效能 ASP.NET 應用的幾點建議ASP.NET
- 構建高效能 ASP.NET 應用的 12 點建議ASP.NET
- 構建高效能ASP.NET應用的幾點建議ASP.NET
- Kris Graft:分享製作道德遊戲的7條實用建議Raft遊戲
- Pinterest:九條實用的旅行建議REST
- 提高程式設計能力的7條建議程式設計
- gstreamer教程(7)——構建應用之Bus的使用
- 將 Web 應用效能提高十倍的10條建議Web
- 使用webpack構建多頁應用Web
- 使用Golang快速構建WEB應用GolangWeb
- 24條 Docker 建議Docker
- 構建 API 應用API
- 「譯」使用 Node 構建命令列應用命令列
- 使用 Cloudflare 構建 Web3 應用CloudWeb
- 使用 WebSocket 構建實時性應用Web
- 使用AngularJS構建大型Web應用AngularJSWeb
- 使用SignalR構建聊天應用程式SignalR
- 構建Docker Image的五個建議Docker
- 使用 HTTP/2 提升效能的7個建議HTTP
- 使用HTTP/2提升效能的7個建議HTTP
- 使用 HTTP/2 提升效能的 7 個建議HTTP
- 使用Electron構建跨平臺的桌面應用
- 使用React構建大型應用的最佳實踐React
- 用VIPER構建iOS應用iOS
- 理解JWT鑑權的應用場景及使用建議JWT
- 建立安全PHP應用程式的實用建議PHP
- 避開NullPointerException的10條建議NullException
- 控制IT預算的5條建議
- 使用Angular與TypeScript構建Electron應用(六)AngularTypeScript
- 使用Rust和WebAssembly構建Web應用程式RustWeb
- 使用微服務構建現代應用程式微服務
- 使用Angular與TypeScript構建Electron應用(一)AngularTypeScript