Backbone的其實感受上上手很難,大概在一年前就想實踐下,結果老是沒有付諸行動,此次需求中狠狠心決定必定要使用一次看看,感覺下。html
但是第一步真的比較困難,由於直接看API好像沒有感受就在網上找實例看看,可是我只能說有些人在給實例的時候根本就沒有考慮過新手的感覺。java
我曾經在看完一些教程以後的迷惑:jquery
1. 在view中this.model到底表明的是什麼?json
2. template如何寫?app
其實這兩個問題很簡單,可能就是一句話的事情,也許是我對於Backbone瞭解不多的緣故,我當時確實不明白。jsp
下面上一點代碼:模塊化
Model:fetch
var TrendModel = Backbone.Model.extend({ urlRoot: '/price/trend.json' }); var trendM = new TrendModel();
這個Model很簡單就是提供一個連接,根據這個連接能夠獲取價格趨勢的數據this
View:url
var TrendView = Backbone.View.extend({ el: $('.js-report-tr'), template: _.template($('#trendTemplate').html()), events: { // 單引號很重要,否則識別不了 'click .js-trend-show': 'show' }, initalize: function() { // 確保this的正確做用域 _.bindAll(this, 'render', 'show'); this.model.bind('change', this.render); }, render: function() { var el = this.template(this.model.attributes); $(this.el).parent().append(el); return this; }, show: function() { // 執行搜索操做,傳遞參數 this.model.fetch({ data: $.param({ comId: 111 }) }); } }); var trendV = new TrendView({ model: trendM });
看最後的3行,你就明白了model是指的什麼了,其實model就是在建立View實例對象的時候傳遞的一個參數,而這個參數就是我上面定義的Model。
View包括幾個部分:
el:我感受就像一個容器或者說是執行環境上下文,應該怎麼描述呢?舉個例子吧,在backbone的view中咱們常常這樣查找元素
this.$el.find('.xx')
其實對應於jquery就是
$('.js-report-tr').find('.xx')
events:事件綁定,這裏其實仍是和el有點關聯,例如在整個文檔中有多個.js-trend-show元素,咱們綁定事件的時候其實是給.js-report-tr下的.js-trend-show元素綁定事件,其餘的不在.js-report-tr的.js-trend-show都不會被綁定對應的事件。
注意點:
1. 事件方法名要加單引號,否則識別不了。
2. View中事件綁定應該使用的是事件代理。
template:模板,我當時看過幾個模板的例子,可是就不知道模板是什麼語言規則,後來其實我以爲本身是有點二了,實際模板就是一個js配合html的產物。backbone的模板有點像java混合jsp的感受,有點混亂的感受,固然好像<%%>能夠自定義成其餘的符號。
在使用Backbone中其實也遇到了一點問題
1. model.fetch操做是否將model的值設置成undefined
最開始的時候使用model.fetch後,在render中獲取this.model是undefined,當時很是鬱悶,想說get請求以後model被清空,那get幹什麼啊,後來查了下資料
使用_.bindAll(this,'render'),確保this的正確做用域。
好像有點混亂,下面作個總結吧
其實Backbone還有Router,Collections沒有使用,因此對於Backbone只能是初步有了個瞭解,Backbone適用於單頁面應用,個人實踐其實有點純粹想實驗一下。
在這個實踐中並無體現Backbone的優點,可是依然可讓代碼看起來更加模塊化。