Ember弃用:使用组件

时间:2015-11-17 12:59:31

标签: ember.js ember-cli deprecation-warning

嘿,我在删除视图方面遇到了问题。

该视图用作导航栏

{{view "inner-form-navbar" navbarParams=innerNavObject}}

params看起来像这样

 innerNavObject: {
        ...
        routeToReturn: 'someroute.index',
        ...
 },

在导航栏上点击父索引路径时会有一个小的“后退”按钮。

目前的工作原理如下:

this.get('controller').transitionToRoute(routeToReturn);

但这不适用于组件,无论如何都是粗略的。我需要以某种方式将路由器注入组件吗?或者有人为此获得了解决方案?导航栏在很多地方使用,因此向navbarObject添加属性以定义某些操作并不是一个非常好的解决方案。

找到这个解决方案:

export default {
    name: 'inject-store-into-components',
    after: 'store',
    initialize: function(container, application) {
        application.inject('component', 'store', 'service:store');
        application.inject('component', 'router', 'router:main'); 
    }
};

现在我可以做到

this.get('router').transitionTo('blah')

2 个答案:

答案 0 :(得分:1)

您可以尝试使用提供路由功能的服务,然后注入组件。

有一个插件似乎就是这样 - ember-cli-routing-service

从链接中获取的示例,适用于您的场景:

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

 someFunc () {
   this.get('routing').transitionTo(this.get('innerNavObject'). routeToReturn);
 } 
});

答案 1 :(得分:0)

使用组件控制您的路由/控制器通常是不好的做法。相反,您希望在您的路线或控制器上有一个动作。然后,您的组件可以向上发送该操作,您的路由或控制器将捕获它(数据向下,操作向上)。

在您的控制器或路线中,您将获得转换操作:

actions: {
  transitionFunction(route) {
    this.transitionTo(route);
  }
}

您还可以在路线或控制器中定义当前路线名称,并将其传递给导航栏组件。控制器可能看起来像:

export default Controller.extend({
  application: inject.controller(),
  currentRoute: computed('application.currentRouteName', function(){
    return get(this, 'application.currentRouteName');
  }),

  actions: {
    transitionFunction(route) {
      this.transitionTo(route);
    }
  }
});

然后调用您的组件并将currentRoute CP传递给它:

{{nav-bar-component currentRoute=currentRoute action='transitionFunction'}}

然后,在您的组件中,您可以使用一个函数从currentRoute中找到父路由:

export default Component.extend({
  click() { // or however you are handling this action
    // current route gives us a string that we split by the . and append index
    const indexRoute = get(this, currentRoute).split('.')[0] + '.index';
    this.sendAction('action', indexRoute);
  }
});

扩展路线

根据您的评论,您可能希望在多个路线或控制器之间进行此操作。在这种情况下,创建一个路由并让其他路由从中扩展。使用操作创建您的路线(就像我在上面创建了控制器一样)。然后将其导入您需要的路线:

import OurCustomRoute from '../routes/yourRouteName';

export default OurCustomRoute.extend({
  ... // additional code here
});

然后您的路线将可以访问您在第一条路线上设置的任何操作或属性。