2017-01-10 6 views
3

Я пытаюсь создать компонент разбиения на страницы для приложения ember 2. Поскольку это компонент разбиения на страницы общего назначения, я хотел использовать его на разных маршрутах. Из-за этого мне нужно как-то (на мой взгляд) указать имя моего маршрута для ссылок на страницы для работы.Ember 2 - Переход на маршрут через компонент

Я могу передать в свой маршрут имя (строка) к компоненту легко: {{pagination-component myRoute='myCurrentRouteName'}}. И внутри компонента: {{link-to myRoute (query-params page=1)}}

Это хорошо работает для перехода на страницы нравится: < < < Во-первых, предыдущий, следующий> Последний >>.

Но я также хотел иметь поле выбора с опциями, указывающими на все страницы, где, если пользователь выбирает страницу, я могу перейти на этот маршрут с помощью queryParams, аналогичного этому: myRoute?page=selectedPage. Все учебники для ember говорят, что переход внутри компонента - это нет-нет.

Но как мне это сделать, учитывая, что я хочу, чтобы моя разбивка на страницы была общей, и я не хочу иметь действия в каждом маршруте, который имеет дело с разбиением на страницы и обеспечивает тот же самый точный переход?

До сих пор я обнаружил, что могу вставлять '-routing' в компонент, который может работать для перехода внутри компонента, но по какой-то причине он также не работает. Плюс люди говорят, что это частные и ненадежные. Я также попытался сделать Route Mixin с действием, поэтому могу просто sendAction от компонента с selectedPage, но я не знаю, как получить маршрутизатор (для того, чтобы позвонить router.transitionTo) в мой Mixin.

ответ

3

Мы должны использовать открытый API для перехода, который предусмотрен в Маршруте transitionTo и в Контроллере transitionToRoute. это рекомендуемый подход.

  1. Как вы сказали, вы можете заставить его работать в компоненте, используя Ember.getOwner(this).lookup('router:main').transitionTo('myRouteName') но это категорически против хорошего дизайна.
  2. Вы можете определить метод с именем myTransitionToUrl внутри actions хэш маршрута Application и установить ember-route-action-helper аддон для вызова метода действия метода myTransitionToUrl из компонента.
  3. Если вы не хотите определять метод в маршруте приложения, вы можете определить его в mixin и реализовать его на требуемом маршруте. это тоже будет работать.
  4. Мой выбор и Рекомендуемый подход бы, Say pagination-component имеет prev, next, transtionTo действия, то я буду реализовать все эти действия в Mixin и расширяющие его во всем маршруте, который использует pagination-component. и будет информировать любые изменения данных для маршрутизации через действия из компонента. что обеспечит также стратегию Data Down Actions Up.
+0

Спасибо! Кажется, я был на правильном пути. Это было последнее, что я пытался сделать (** # 4, используя Mixin **). Но, как я упоминал ранее, я могу расширить Mixin на своих маршрутах и ​​определить действия, такие как ** prev **, ** next ** в нем. Вопрос остается следующим: Как я ссылаюсь на ** router ** внутри Mixin? _ Потому что кажется, что мне нужно вызвать 'router.transitionTo' из ** действий ** prev **/** next **. – GogromaT

+0

Нет. Вы можете просто сказать «это».transitionTo' внутри, так как 'this' относится к экземпляру маршрута – kumkanillam

+0

o, это правильно! Однако я пытаюсь # 4, и я столкнулся с проблемой. Поскольку компонент изолирован, когда я буду вызывать 'this.sendAction' из компонента, это не вызовет никаких действий. Я должен был бы сказать «{{pagination-component prev = (route-action 'prev') next = (route-action 'next') ...}}' везде, где я хотел бы использовать этот компонент. Есть ли способ, чтобы эти действия автоматически ссылались каким-то образом? Поскольку маршрут Mixin будет иметь одно и то же имя для всех этих действий (prev, next и т. Д.). – GogromaT