ns.router
Умеет:
- получать из урла -
idстраницы (layout) и параметрыparams - генерировать url-ы по
idстраницы и параметрамparams
API
ns.router.baseDir: {string}
Базовая часть урла (если приложение располагается не в корне сайта.
ns.router(url): { page:string, params:{object} }
Выполняет роутинг: вычисляет по url какая это страница page (это id layout-а) и вытаскивает параметры из урла.
Если в урле были GET параметры - они подклеиваются в итоговый набор params.
Когда выполняется роутинг выполняются:
- (опционально) redirect-ы (получаем новый урл после redirect-а и ещё раз выполняем роутинг)
- (опционально) rewrite (текущий урл заменяется на прописанный в rewrite-е, параметры подклеиваются в конце как GET параметры)
- роутинг (ищем первый подходящий шаблон урла, подробнее см.
ns.router.routes. Если не удалось заматчится - считаем, что получили страницу сnot-found) - (опционально) rewrite параметров (при желании, меняем что-то в полученном объекте с параметрами
params).
ns.router.url(url): { string }
Генерация урла, когда урл известен и нужно только дописать базовую часть.
Странный метод, лучше использовать ns.router.generateUrl
ns.router.generateUrl(id, params): {string}
Генерация урла по id страницы (layout) и по набору параметров.
Это операция, обратная той, которую делает ns.router.
Умеет разворачивать rewrite-ы (после генерации урла проверяет, есть ли rewrite правила для полученного урла и выполняет их в обратную сторону).
В случае неуспеха - кидает ошибку.
ns.router.routes: {object}
Это объект, в котором нужно указать все урлы, rewrite-ы и redirect-ы. Кроме этого поддерживается rewrite параметров.
redirect - прописываются редиректы. Можно указать шаблон урла, который надо заматчить и можно указать функцию, которая вычисляет, куда делается редирект.
rewriteUrl - тут указаны урлы (не шаблоны урлов) и можно указать rewrite для конкретного урла на другой конкретный урл.
route - тут прописано соответствие шаблона урла - странице (layout-у).
Матчинг урла выполняется сверху вниз. А значит у урла, который выше - больше приоритет.
Отсюда правило - более общие шаблоны урлов указывать ниже.
Матчинг выполняется до первого успешного сопоставления.
Одной и тоже странице может соответствовать несколько шаблонов урлов.
rewriteParams - для страницы (layout-а) можно указать функцию, в которой произвольным образом поменять params.
ns.router.routes = {
redirect: {
'/': '/inbox',
'/inbox/old/{int:int}': '/inbox',
'/inbox/my': function() {
return '/inbox';
},
'/inbox/my/{int:int}': function(params) {
return '/inbox/' + params.int;
}
},
rewriteUrl: {
'/page1': '/page/1'
},
route: {
'/inbox': 'messages',
'/message/{mid:int}': 'message',
'/page/prefix{page:int}': 'url-with-prefix',
'/search/{request:any}': 'search'
},
rewriteParams: {
'message': function(params) {
return { id: params.mid };
}
}
};ns.router.regexps: {object}
Тут задаются типы параметров в виде регулярных выражения.
Начальный набор такой:
ns.router.regexps = {
'id': '[A-Za-z_][A-Za-z0-9_-]*',
'int': '[0-9]+'
};Параметры
Параметры в урле задаются в {}, к примеру, /message/{message-id}.
Параметр может быть как между /-ами, так и в промежутках, к примеру, /archive/{year}-{month}-{day}.
Тип указывается после имени параметра и отделяется :: {page:int}.
Если параметр указан без типа - ему присваивается тип id. Т.е. {message-id} соответствует {message-id:id}.
Параметр может быть опциональным.
В этом случае, слеш перед ним тоже становится опциональным.
Чтобы указать, что параметр опционален - нужно дописать = или =default после имени параметра (или типа, если он указан),
примерно так: {page=}, {page=0}, {page:int=} или {page:int=0}.
Если в исходном урле параметр не задан, но указано дефолтное значение - оно будет в итоговом наборе параметров страницы params.
Можно указать фильтр значения параметра.
В этом случае параметр должен иметь строго указанное значение, только в этом случае урл будет заматчен.
Чтобы указать фильтр нужно дописать ==filter после имени параметра (или типа, если он указан), примерно так: {color==green} или {color:colors==green}.
Можно указать либо дефолтное значение, либо фильтр.