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}
.
Можно указать либо дефолтное значение, либо фильтр.