2012-05-09 8 views
3
にRouter.routesで外部メソッドをバインドするために

それはRouter.routesマップ内の他のオブジェクトからメソッドをバインドすることは可能ですか?どのようBACKBONE.JS

私はビューの内のすべての「ロジックコード」を持っていると私はルータでメソッドを定義避けたいです。例えば

、私はこれを持っている:

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

私はここのどこかを、読んだと思いますか?いい考えはありません。しかし、一流の関数を値としてroutesオブジェクトに渡すことができます。この方法:

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

ただし、保証はありません!私がこれを読んだところで不思議。これは

+1

を提供するものから期待し何の答え、それは動作しません。エラーはスローされませんが、関数は呼び出されません。とにかくありがとう。 –

2

Backbone.Marionette's AppRouterをチェックアウト...それはあなただけで必要なルート方法を提供することであり、コントローラオブジェクトを提供することができます。これは、コールバックのthisとしてバインドappで、ルートのコールバック関数としてapp.playHomeを呼んだ

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)) 
    }, 

2

はここで...あなたが探しているものを達成する別の方法です。

関連する問題