3

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

Views内にすべての「ロジック コード」があり、 Routerでメソッドを定義することは避けたいと思います。

たとえば、私はこれを持っています:

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

私はこのようなことをしたいと思います:

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

前もって感謝します

4

4 に答える 4

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

このソリューションは、バックボーンがルートごとにイベントを発生させ、ルーター自体で関数を呼び出すという事実に依存しています。ルーターで何もしないダミー関数を許可する場合は、ルーターのイベントに好きなものをアタッチし、他のオブジェクトで任意の数の他の関数を呼び出して、必要に応じてすべてをアタッチ (またはデタッチ) できます。

于 2012-05-15T20:55:03.053 に答える
2

Backbone.Marionette の AppRouterを確認してください。必要なルート メソッドを提供するだけでよいコントローラー オブジェクトを提供できます。

于 2012-05-16T10:14:19.093 に答える
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ています。

于 2012-05-21T14:18:39.147 に答える
0

私はこれをどこかで読んだと思います、どこで?わからない。ただし、第一級関数を値としてroutesオブジェクトに渡すことができます。こちらです:

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

ただし、保証はありません。どこで読んだのかしら。お役に立てれば

于 2012-05-09T14:10:15.307 に答える