3

Backbone.js でルートの before フィルターを実装しようとしています。ここで次のコードを見つけました-

var MyRouter = Backbone.Router.extend({
    route: function(route, name, callback) {
        return Backbone.Router.prototype.route.call(this, route, name, function() {
            this.trigger.apply(this, ['beforeroute:' + name].concat(_.toArray(arguments)));
            callback.apply(this, arguments);
        });
    }
});

しかし、次に何をする必要があるのか​​ わかりません。必要な「ルート前」ロジックを使用して関数を定義する必要がありますが、それがどのように呼び出されるのか正確にはわかりません。

4

3 に答える 3

6

オーバーライドさrouteれた関数は、 という名前のイベントをトリガーしbeforeroute:routename、元の関数を呼び出しrouteます。したがって、次のようなルートがある場合:

var MyRouter = Backbone.Router.extend({
    routes: { 
        "": "home"
    },
    // ...
});

次に、次を使用してbeforerouteイベントをサブスクライブします。

var router = new MyRouter()

router.on("beforeroute:home", function() {

    // before route logic here...
    alert("Home route is about to get hit ...");
});

フィドルのデモ。

于 2012-12-08T02:31:13.997 に答える
0

これを行う別の方法は、 Router.route 関数を拡張することです。私がしなければならなかったことの例を以下に示します(ユーザーが認証されていることを確認するため)。これは基本的に、元のバックボーン コード (1.0.0) と私のカスタム コード (コメントでマークされています) です。

  Backbone.Router.prototype.route = function(route, name, callback) {
    if (!_.isRegExp(route)) route = this._routeToRegExp(route);
    if (_.isFunction(name)) {
      callback = name;
      name = '';
    }
    if (!callback) callback = this[name];
    // here my custom code
    callback = _.wrap(callback, _.bind(function(cb) {
      if (name == 'login' || sessionModel.authenticated()) {
        _.bind(cb, this)();
      } else {
        this.navigate('login', {trigger: true});
      }
    }, this));
    // finish my custom code
    var router = this;
    Backbone.history.route(route, function(fragment) {
      var args = router._extractParameters(route, fragment);
      callback && callback.apply(router, args);
      router.trigger.apply(router, ['route:' + name].concat(args));
      router.trigger('route', name, args);
      Backbone.history.trigger('route', router, name, args);
    });
    return this;
  };

ルーター_.wrapを使用するときに期待されるものです_.bindthisそうしないと、「これは未定義です」というエラーが発生しました。

于 2013-04-30T12:23:48.933 に答える
0

私のような他の人が混乱しているだけで、なぜこれが機能しないのですか。(もう) バックボーン バージョン 0.9.10 以降、壊れているようです。(本当の理由はわかりません)

しかし、バージョン 1.0.0 では、メソッドへの参照の代わりに関数リテラルを使用できるようになりました。http://backbonejs.org/#changelog

したがって、ルートを呼び出す前に何かを行うことができます...

routes: {
   'your-route' : function(){ if(yourCondition){ yourAction(); }}
}
于 2013-04-30T09:55:05.387 に答える