3

我正在尝试为 ember 2 应用程序制作分页组件。由于它是一个通用的分页组件,我想在许多不同的路线上使用它。因此,我需要以某种方式(在我的脑海中)提供我的路线名称,以便分页链接工作。

我可以轻松地将我的路由名称(字符串)传递给组件: {{pagination-component myRoute='myCurrentRouteName'}}. 在组件内部:{{link-to myRoute (query-params page=1)}}

它适用于以下页面:<< First, < Previous, Next > , Last >>。

但我也希望有一个带有指向所有页面的选项的选择框,如果用户选择一个页面,我可以使用类似于这样的 queryParams 转换到该路由myRoute?page=selectedPage:ember 的所有教程都说在组件内进行转换是禁忌。

但是我该怎么做呢,因为我希望我的分页是通用的,并且我不想在处理分页并提供相同精确转换的每条路线中都采取行动?

到目前为止,我发现我可以将“-routing”注入到组件中,这可以在组件内进行转换,但由于某种原因它也不能安静地工作。另外,人们说它是私人的,不可靠的。我还尝试制作一个带有动作的 Route Mixin,这样我就可以简单地sendAction从带有 的组件中获取selectedPage,但我不知道如何router.transitionTo在我的 Mixin 中获取路由器(以便调用)。

4

1 回答 1

4

我们应该使用公共 API 进行转换,它在 Route transitionTo和 Controller transitionToRoute中提供。这是推荐的方法。

  1. 正如您所说,您可以使用它在组件中工作,Ember.getOwner(this).lookup('router:main').transitionTo('myRouteName')但这强烈反对良好的设计。
  2. myTransitionToUrl您可以在路由actions的 hash 中定义命名的方法Application,并安装ember-route-action-helpermyTransitionToUrl插件以从组件调用路由操作方法。
  3. 如果您不想在应用程序路由中定义方法,那么您可以mixin在所需的路由中定义并实现它。这也将起作用。
  4. 我的选择和推荐方法是,Say pagination-componenthas prev, next, transtionToactions,然后我将Mixin在所有使用pagination-component. 并将通知任何数据更改以通过组件的操作进行路由。这也将确保Data Down Actions Up策略。

  5. 如果您只是过渡到不同的路线,那么最新的可能方法是,

如果ember版本大于2.15,可以直接注入RouterService并调用transitionTo方法。如果您使用的是 ember 2.15 或以下版本,则可以使用路由器服务polyfill 来使用 RouterService。

import Ember from 'ember';

export default Ember.Component.extend({
  router: Ember.inject.service(),

  actions: {
    next() {
      this.get('router').transitionTo('other.route');
    }
  }
});
于 2017-01-11T02:09:48.850 回答