Ответ 1
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
, который помечен как закрытый. Тем не менее, я бы использовал это решение, так как оно более эффективно, чем первое.