Ember 2 - 过渡到通过组件进行路由

Gog*_*maT 3 ember.js ember-router ember-components

我正在尝试为 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,但我不知道如何在我的 Mixin 中获取路由器(以便调用router.transitionTo)。

Emb*_*eak 5

我们应该使用公共 API 进行转换,该 API 在RoutetransitionTo和 ControllertransitionToRoute提供。这是推荐的方法。

  1. 正如您所说,您可以使其在组件中工作Ember.getOwner(this).lookup('router:main').transitionTo('myRouteName'),但这强烈反对良好的设计。
  2. 您可以在路由的哈希myTransitionToUrl内部定义名为的方法,并安装ember-route-action-helper插件来从组件调用路由操作方法。actionsApplicationmyTransitionToUrl
  3. 如果你不想在应用程序路由中定义方法,那么你可以mixin在所需的路由中定义并实现它。那也行。
  4. 我的选择和推荐的方法是,假设pagination-componentprev, next,transtionTo操作,那么我将在所有使用 的路线中实施所有这些操作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');
    }
  }
});
Run Code Online (Sandbox Code Playgroud)