2012-04-04

Backbone.js 的 Router

Backbone.Router 的主要功能是能夠在不刷新頁面的情況下, 變更 URL, 同時執行不同的功能。不論建立幾個 Router 物件, 要啟作用時都必須呼叫 Backbone.history.start()。

  • 屬性 routes: 用來設定 routes hash 對應的動作 ( actions, functions )。
  • 方法 initialize: 初始化呼叫, 自行定義。建立 Router 物件時若傳入 Object 物件, 讓物件會視為 routes 的設定。
  • 方法 route: 動態設定 routes hash 對應的動作。
  • 方法 navigate: 呼叫此方法以變更 URL。第一個參數為字串, 第二個參數為 Object 物件。Object 物件屬性 trigger 設定為 true 時, 表示要呼叫 route function。Object 物件屬性 replace設定為 true 時, 表示不留在 history 裡。

呼叫 Backbone.history.start() 時傳入的 Object 物件屬性可以有三個:

  • 屬性 pushState: 設定為 true 時表示使用 HTML5 的 pushState 功能, 將不會在 URL 使用 # , 這通常需要做後端 URL mapping 設定。
  • 屬性 root: 如果路徑不是 / 可以使用 root 設定。 
  • 屬性 silent: 如果不願在初始化時呼叫 route function, 把 silent 設定為 trrue。

在 IE 建議不要使用以上三個屬性設定... 囧。


<<< t02_Router.html ----------------------------------->>>
<html>
 <head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
 </head>
 <body>
  <div id="buttons" mydata="shinder">
   <button id="b1"> Button 1 </button>
   <button id="b2"> Button 2 </button>
   <button id="b3"> Button 3 </button>
  </div>
  <script type="text/javascript" src="js/jquery-1.7.1.js"></script>
  <script type="text/javascript" src="js/coffee-script.js"></script>
  <script type="text/javascript" src="js/json2.js"></script>
  <script type="text/javascript" src="js/underscore-1.3.1.js"></script>
  <script type="text/javascript" src="js/backbone.js"></script>
  <script type="text/coffeescript" src="t02_Router.coffee"></script>
 </body>
</html>

<<< t02_Router.coffee ----------------------------------->>>
$ = jQuery
$ ->
 class ButtonsView extends Backbone.View
  el: '#buttons'
  events:
   'click': 'onClick'
  onClick: (event)->
   switch $(event.target).attr('id')
    when 'b1'
     @router.navigate '', {trigger: true}
    when 'b2'
     @router.navigate 'help/有問題:好用嗎', {trigger: true}
    when 'b3'
     @router.navigate 'search/b3', {trigger: true}

 class MyRouter extends Backbone.Router
  routes:
   '':  'index'
   'help/*quiz': 'help'
   'search/:query': 'search'
  index: ->
   console.log 'index'
  help: (quiz)->
   console.log quiz
  search: (query)->
   console.log query

 myRouter = new MyRouter
 buttonsView = new ButtonsView
 buttonsView.router = myRouter

 Backbone.history.start()

沒有留言:

FB 留言