Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Научить ns.router генерить ссылки на страницы #123

Closed
chestozo opened this issue Jun 28, 2013 · 22 comments
Closed

Comments

@chestozo
Copy link
Member

Поскольку ns.router сейчас основной хранитель данных о том, как парсится урл и какая это страница в итоге, хочется его ещё научить генерировать урлы (чтобы можно было написать ns.router.url('letter-view', { id: 1, folder: 2 }) и получить урл на выходе).

Для этого нужно 2 вещи:

  • понять, достаточно ли нам для генерации урла указать название layout и параметры
  • реализовать )

Есть ли те, кому это тоже кажется полезным? )

@pasaran
Copy link
Contributor

pasaran commented Jun 28, 2013

Кажется полезно, да.

И нет, недостаточно, похоже. У тебя может быть два роута для одного лэйаута.
Например, /inbox и /folder/12345.

@chestozo
Copy link
Member Author

И нет, недостаточно, похоже. У тебя может быть два роута для одного лэйаута.

Я вот тоже сомневаюсь.
А тебе не кажется, что параметры должны в этом смысле рулить?

Т.е. передаётся layout и params.
Берём все возможные урлы по layout.
Пытаемся строить урл по параметрам начиная с первого.
Как только построили: готово.

@pasaran
Copy link
Contributor

pasaran commented Jun 28, 2013

Тебе говорит что-нибудь слово "биекция"?

@chestozo
Copy link
Member Author

нет, но я посмотрю )

@chestozo
Copy link
Member Author

Не понял, при чём это здесь )

@pasaran
Copy link
Contributor

pasaran commented Jun 28, 2013

Ну вот отображение урлов в layout не биекция.
Значит без дополнительных данных обратное отображение невозможно.
Ну вот, например, есть два роута:

'/folder/NNN' -> 'messages', { fid: NNN }
'/inbox' -> 'messages', { fid: 1 }

Вот у тебя есть 'messages', { fid: 1 }.
Как ты будешь урл строить?
По какому роуту?


@chestozo
Copy link
Member Author

'/inbox' -> 'messages', { fid: 1 }

А откуда там fid?

@pasaran
Copy link
Contributor

pasaran commented Jun 28, 2013

Откуда-то.
Это константа, прибитая гвоздями.
В нашем конкретном случае из списка фолдеров.

Ну не важно.
Пусть будет другой пример, более сложный:

'/folder/NNN' -> 'messages', { fid: NNN }
'/search/TXT -> 'messages', { text: TXT }

и есть у тебя 'messages', { fid: NNN, text: TXT } — что соответствует поиску по папке NNN.

@pasaran
Copy link
Contributor

pasaran commented Jun 28, 2013

Ты не забывай, что не все параметры появляются в роутах.
Есть же еще "все остальное".
Типа /folder/123?sort=date.

@chestozo
Copy link
Member Author

Т.е. нам нужен какой-то уникальный идентификтор урла.
Вроде бы, достаточно просто ввести дополнительный параметр рута name, к примеру, или id.
Тогда задача становится более топорной, но менее гибкой.

Вообще, хочется использовать этот новый метод вот так:
есть страница просмотра письма, к примеру
есть листалка "след" / "пред"
ссылку на следующее письмо хочется генерить вот так:
ns.router.url('letter-view', no.extend(ns.page.current.params, { id: 2 }))

@doochik
Copy link
Contributor

doochik commented Jul 1, 2013

Я вот подумал, а может на https://github.com/nodules/susanin переехать?
Там уже все есть )

@chestozo
Copy link
Member Author

chestozo commented Jul 1, 2013

Кажется, его нужно обернуть, потому что:

  • чтобы сгенерить урл ему надо передать "шаблон урла", который надо где-то хранить
  • я не вижу, есть ли поддержка baseDir
  • я не понимаю, есть ли какой-то идентификатор урла (layout_id)

Ну т.е. как движок внутри ns.router можно, но там так мало функционала, что непонятно, зачем тут зависимости плодить.

@pasaran
Copy link
Contributor

pasaran commented Jul 1, 2013

Susanin точно так же не сможет построить урл /inbox из fid'а.

@doochik
Copy link
Contributor

doochik commented Jul 1, 2013

@chestozo

  1. смутно представляю как реализовать по другому. Делать обратный paramsObject -> pattern матчинг?
  2. логично, что это можно делать сверху до susanin
  3. доп.данные можно запизать в data для маршрута

@pasaran
возможно, что это проблема урлов

@chestozo
Copy link
Member Author

chestozo commented Jul 1, 2013

  1. смутно представляю как реализовать по другому. Делать обратный paramsObject -> pattern матчинг?

Ну мы с @pasaran договорились вроде как до именованных рутов, примерно так:

ns.routes = {
  'router-name': {
    layout: 'layout-id',
    pattern: 'url-pattern'
  }
};
ns.router.url('route-name', params);

@doochik
Copy link
Contributor

doochik commented Jul 1, 2013

Да, в susanin тоже susanin.getRouteByName('route-name').build(params)

@pasaran
Copy link
Contributor

pasaran commented Jul 1, 2013

Мы вроде ни до чего не договорились.

@doochik что будет, если несколько урлов в один route мапятся?
Какой из них выберется для построения урла?

@doochik
Copy link
Contributor

doochik commented Jul 1, 2013

такого не бывает, ты берешь роут по имени, в котором только один паттерн

@pasaran
Copy link
Contributor

pasaran commented Jul 1, 2013

Ну тогда нам не подходит вроде бы.
У нас на messages может много урлов мапиться.

@doochik
Copy link
Contributor

doochik commented Jul 1, 2013

ты сейчас про какой messages говоришь?

@pasaran
Copy link
Contributor

pasaran commented Jul 1, 2013

Леша привел пример, как описывается роут в сусанине:

susanin.addRoute({
        'name': 'folder-route',
        'pattern': '/folder/<fid>',
        'conditions' : {
            'fid' : '\\d+'
        },
        'data': {
           layout: 'messages'
        }
    });

Что мне не нравится:

  • На один роут надо написать довольно много всего.
  • Для большинства роутов там везде будет все одно и то же.
  • Кондишены нужны глобальные. Когда что-то уникальное, то можно дописывать локальные.
  • Имя роута непонятно, нужно ли. Для построения урлов он все равно нам не поможет.
  • Непонятно, зачем роуты по одному добавлять. Лишняя писанина. Нужно уметь пачкой.

Как-то так:

router.add([
    //  простой роут.
    '/folder/<num:fid>', 'messages',
    '/folder/<fid>', {
        layout: 'messages',
        conditions: {
            fid: '\\d+'
        }
]);

Ну, наверное, можно обертку сделать, да.

@chestozo
Copy link
Member Author

fixed in #154

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants