【问题标题】:Ember 2 - Transition to route through componentEmber 2 - 过渡到通过组件的路由
【发布时间】:2017-05-25 13:03:55
【问题描述】:

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

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

它适用于以下页面: , Last >>.

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

但是,鉴于我希望我的分页是通用的,并且我不想在处理分页并提供相同精确转换的每条路线中都有操作,我该怎么做?

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

【问题讨论】:

    标签: ember.js ember-router ember-components


    【解决方案1】:

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

    1. 正如您所说,您可以使用Ember.getOwner(this).lookup('router:main').transitionTo('myRouteName') 使其在组件中工作,但这强烈反对良好的设计。
    2. 您可以在Application 路由的actions 哈希中定义名为myTransitionToUrl 的方法,并安装ember-route-action-helper 插件以从组件调用路由操作方法myTransitionToUrl
    3. 如果你不想在应用路由中定义方法,那么你可以在mixin中定义它,并在需要的路由中实现它。这也行。
    4. 我的选择和推荐方法是,假设pagination-componentprev,next,transtionTo 动作,那么我将在Mixin 中实施所有这些动作并将其扩展到使用pagination-component 的所有路由中。并将通知任何数据更改以通过组件的操作进行路由。这也将确保Data Down Actions Up 策略。

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

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

    import Ember from 'ember';
    
    export default Ember.Component.extend({
      router: Ember.inject.service(),
    
      actions: {
        next() {
          this.get('router').transitionTo('other.route');
        }
      }
    });
    

    【讨论】:

    • 谢谢!看来我是在正确的道路上。这是我尝试做的最后一件事(#4 using Mixin)。但正如我之前提到的,我可以在我的路由中扩展 Mixin 并在其中定义诸如 prevnext 之类的操作。问题仍然是 How do I reference router inside of a Mixin? 因为我似乎需要从 prev / 下一步 操作。
    • 没有。你可以说this.transitionTo inside action,因为this 指的是路由实例
    • 哦,没错!但是我正在尝试#4,但遇到了问题。由于组件是隔离的,当我从组件调用this.sendAction 时,它不会触发任何操作。我不得不在任何我想使用该组件的地方说{{pagination-component prev=(route-action 'prev') next=(route-action 'next') ... }}。有没有办法以某种方式自动引用这些操作?由于路由 Mixin 将具有所有这些操作(上一个、下一个等)的相同名称。
    • 尝试this.get('prev')(),而不是来自pagination-component的sendAction
    • 我试了一下,效果很好!非常感谢您发布它!只是我试图使用有限制的路由动作。我试图选择带有select 选项的某个页面,如下所示:<select ... {{action (route-action 'goToPage' myRouteName value="target.value") on='change'}} >,但 route-action 无法处理事件 (from what I understand)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多