2012-05-09 42 views
3

是否可以綁定來自Router.routes map中的其他對象的方法?如何在Backbone.js的Router.routes中綁定外部方法

我把所有的「邏輯代碼」的意見裏面,我想避免界定在路由器方法。

舉例來說,我有這樣的:

var app = new (Backbone.View.extend({  
     playHome: function(){ 
      // logic code here 
     } 
//.......... 
}); 
var router = new (Backbone.Router.extend({ 
     routes: { 
      "play"   : 'playHome' 
     }, 
     playHome: function(){ 
      app.playHome(); 
     } 

我woud喜歡做這樣的事情:

var router = new (Backbone.Router.extend({ 
     routes: { 
      "play"   : 'app.playHome' 
     }, 

在此先感謝

+0

賞金還在嗎,不知道約翰提供的什麼答案 – Deeptechtons

回答

4

這裏有一個很簡單的方法來完成你想要的:

var WorkspaceRouter = Backbone.Router.extend({ 
    routes: { 
     "help": "help", // #help 
     "search/:query": "search", // #search/kiwis 
     "search/:query/p:page": "search" // #search/kiwis/p7 
    }, 

    help : function() { }, 

    search : function() { } 
    }); 

    var App = { 
    help: function() { console.log("help"); }, 

    search: function(query, page) { console.log("search", query, page); } 
    }; 

    $(document).ready(
     function() { 
     var router = new WorkspaceRouter(); 
     Backbone.history.start(); 

     router.on("route:help", App.help); 
     router.on("route:search", App.search); 
     } 
); 

該解決方案依賴於骨幹觸發各條路線的事件以及調用路由器本身上的功能的事實。如果你願意允許路由器上的虛擬功能不做任何事情,那麼你可以將任何你喜歡的東西附加到路由器的事件上,並在其他對象上調用任意數量的其他功能,根據需要附加整個事物(或分離它)。

0

我覺得我讀這個地方在哪裏?不知道。但是您可以將一等函數作爲值傳遞給路由對象。這樣:

var router = new (Backbone.Router.extend({ 
    routes: { 
     "play"   : app.playHome 
    }, 

雖然沒有保證!不知道我在哪裏讀到這個。希望這有助於

+1

不起作用。沒有錯誤是拋出但函數沒有被調用。不管怎麼說,還是要謝謝你。 –

2

這裏是另一種方式來完成你在找什麼...

var app = new (Backbone.View.extend({  
    playHome: function(){ 
     // logic code here 
    } 
    //.......... 
}); 

var router = new (Backbone.Router.extend({ 
    initialize: function(){ 
     // route, route name for event, callback function 
     this.route("play", "playRoute", _.bind(app.playHome, app)) 
    }, 

它調用的app.playHome作爲路線的回調函數,以app綁定爲this回調。