2

バックボーン付きのデバイス、レールを使用しています。すべてのバックボーン ルートは正常に機能しています。ただし、レールによってレンダリングされるはずの /accounts/login などの非バックボーン ルートは、バックボーン ルーターでグロブ化されています。

SS.Routers.ApplicationRouter = Backbone.Router.extend({
  initialize: function() {
    this.el = $("#content");
  },

  routes: {
    "": "home"
  },

  "home": function () {
    console.debug("Got home request");
    var view = new SS.Views.Home();
    this.el.empty().append(view.render());
  }
});

/accounts/login への実際のリクエスト/レスポンスは、Rails ログから発生しています。しかし、バックボーンのホーム ルートが後でトリガーされ、ホームページがレンダリングされます。

私のレイアウトは

  $(function () {
    SS.init();
  });

から

window.SS = {
  Models: {},
  Collections: {},
  Views: {Providers: {}},
  Routers: {},
  init: function (data) {
    console.debug("Initializing Backbone Components");
    new SS.Routers.ApplicationRouter();
    new SS.Routers.ProvidersRouter();
    if (!Backbone.history.started) {
      Backbone.history.start();
      Backbone.history.started = true;
    };
  }
};

これが私のホームルートを再びトリガーしています。

"" バックボーンのルートは /accounts/login をグロビングすることを想定していませんが、そうです。

少しデバッグすると、フラグメントが空の文字列であるため、 /accounts/login が "" によって取り込まれていることがわかります。

また、バックボーン ルートに一致するものがないすべてのケースで、フラグメントは空の文字列です。

バックボーン 0.9.2 からのコード

loadUrl: function(fragmentOverride) {
      var fragment = this.fragment = this.getFragment(fragmentOverride);
      var matched = _.any(this.handlers, function(handler) {
        if (handler.route.test(fragment)) {
          console.debug(handler);
          console.debug(fragment);
          handler.callback(fragment);
          return true;
        }
      });
      return matched;
    },

助言がありますか?

4

1 に答える 1

0

クラス ('passThrough') または 'data-passThrough=true' 属性をリンクに追加します。ルーターでこのクラス/属性をキャッチして true を返すと、Backbone は処理を停止し、ブラウザーはそれを通常のリンクとして扱います。

于 2013-01-04T07:08:52.793 に答える