yandex-ui / noscript

Noscript: JavaScript MVC Framework for building SPA
http://yandex-ui.github.io/noscript/
MIT License
34 stars 22 forks source link

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

Closed chestozo closed 11 years ago

chestozo commented 11 years ago

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

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

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

pasaran commented 11 years ago

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

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

chestozo commented 11 years ago

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

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

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

pasaran commented 11 years ago

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

chestozo commented 11 years ago

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

chestozo commented 11 years ago

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

pasaran commented 11 years ago

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

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

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

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

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

pasaran commented 11 years ago

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

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

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

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

pasaran commented 11 years ago

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

chestozo commented 11 years ago

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

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

doochik commented 11 years ago

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

chestozo commented 11 years ago

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

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

pasaran commented 11 years ago

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

doochik commented 11 years ago

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

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

chestozo commented 11 years ago

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

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

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

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

pasaran commented 11 years ago

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

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

doochik commented 11 years ago

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

pasaran commented 11 years ago

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

doochik commented 11 years ago

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

pasaran commented 11 years ago

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

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 commented 11 years ago

fixed in #154