Tutorial: ns.router

ns.router

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}.

Можно указать либо дефолтное значение, либо фильтр.

comments powered by Disqus