14

を使用して、アプリケーション内の無効なルートを処理する方法を理解しようとしていますEmber.Router

現在、myapp.com /#FooBarDoesntExistなどの無効なルートを入力すると、インデックスルート('/')にリダイレクトされます。何が起こったのかをユーザーに知らせることができるように、ルーティング先のnotFoundまたは404状態を定義できればと思います。それらがホームページにダンプされるのとは対照的に。

4

3 に答える 3

6

現在のバージョンの Ember.Router は、未知のルートを処理する手段を提供していません。ハッキングする時間です!

解決策 1 - クイック アンド ダーティ

ここでの考え方は次のとおりです。Ember.Router.route(path)要求された (潜在的に不明な) パスで呼び出されるメソッドがあります。このメソッドの呼び出し後、ルーターのパスが既知であることが保証されます。そのため、要求されたパスと実際のパスを比較してそれらが異なる場合、要求されたパスは無効であり、ユーザーを 404 ページにリダイレクトする可能性があります。

  App.Router = Ember.Router.extend({

    route: function(path) {
      this._super(path);
      var actualPath = this.get("currentState").absoluteRoute(this);
      if (path !== actualPath) {
        this.transitionTo("404page");
      }
    }
  });

このソリューションは非常に高価です。たとえば、現在の状態が「/a/b/c」で、ユーザーが「/b/d/e/unknown」に移動したい場合、ルーターは既知の状態「b」、「d」、および「e」、そしてその場合にのみ、パスを不明として破棄します。実際のルーティングが開始される前に、これを伝えることができればよいでしょう。

解決策 2 - プライベート メソッドをいじる

ここでは、指定されたパスの有効性を確認してから、ルーターに続行するように指示します。

App.Router = Ember.Router.extend({

checkPath: function (path) {
  path = path.replace(this.get('rootURL'), '').replace(/^(?=[^\/])/, "/"); 
  var resolvedStates = this.get("states.root").resolvePath(this, path);
  var lastState = resolvedStates.get("lastObject");
  return lastState.match.remaining == "";
},

route: function(path) {
  if (this.checkPath(path)) {
    this._super(path);
  } else {
    this.transitionTo("404page");
  }
}
});

このソリューションには欠点もありますresolvePath。プライベートとしてマークされたメソッドを使用します。それにもかかわらず、最初のソリューションよりも効果的であるため、このソリューションを使用します。

于 2012-10-12T19:06:26.267 に答える
2

Ember 1.13 でこれを行うために推奨される方法は、キャッチオール ルートを作成することです。

Router.map(function () {
  this.route('home');
  this.route('login');
  this.route('404', { path: '/*path' });  // capture route in path
});

次に、404 テンプレートを に入れます404.hbs

于 2015-08-26T22:15:33.697 に答える