未指定子路由时EmberJS重定向

时间:2014-11-13 16:15:29

标签: ember.js ember-router

我有一组嵌套路由和模板,如果没有指定子路由,我想自动选择第一个模型。路线结构是:

App.Router.map(function() {
  this.route('sales', function () {
    this.route('orders', function () {
      this.route('order', { path: ':order_id' });
    });  
  });
});

如果用户点击sales.orders,则应将其重定向到sales.orders模型上的第一个订单。做这项工作没问题。问题出现在用户点击sales/orders/:order_id时无论:order_id是什么,用户始终会重定向到orders数组中的第一个订单。

我目前正在setupController路由的SalesOrders挂钩中执行重定向,因为我在重定向之前需要在控制器上进行一些排序。

App.SalesOrdersRoute = Ember.Route.extend({
  model: function () {
    return this.store.find('order');
  },

  setupController: function (controller, model) {
    controller.set('model', model);
    var firstObject = controller.get('sortedContent').get('firstObject');
    this.transitionTo('sales.orders.order', firstObject);
  }
});

App.SalesOrdersController = Ember.ArrayController.extend({
  sortProperties: ['orderNumber:desc'],
  sortedContent: Ember.computed.sort('model', 'sortProperties')
});

a jsbin显示了我的问题。

点击any specific order将始终重定向到数组中的第一个顺序(在本例中为4)。

我需要它来保留深层链接的网址,并且只在没有指定订单时重定向。

我觉得this questionthis question都与我尝试做的相似,但如果没有指定子路由,则两个地址都不会自动选择第一项。

2 个答案:

答案 0 :(得分:1)

您应该在SalesOrdersIndex路线中进行重定向。只有在匹配完整的URL映射时,才会创建每个路由的附加索引路由。因此,对于任何不完全是“销售/订单”的网址,它都不会被创建。正是你想要的。

App.SalesOrdersIndexRoute = Ember.Route.extend({
  setupController: function (controller, model) {
    controller.set('model', model);
    this.controllerFor('salesOrders').set('model',model);
   var firstObject = this.controllerFor('salesOrders').get('sortedContent').get('firstObject');
    this.transitionTo('sales.orders.order', firstObject);
  }  
}); 

jsbin:4 3 2 1 redirect to 4

答案 1 :(得分:0)

一个选项可能是检查afterModel挂钩上的转换,并重定向如果用户正在尝试访问sales.orders.index路由。

这样的事情:

afterModel: function(model, transition){
  if (transition.targetName === "sales.orders.index"){
    var first = model.objectAt(0);
    this.transitionTo('sales.orders.order', first);
  }
}

Here's an example.

这不适用于setupController,因为setupController挂钩无法访问转换。在您的情况下,由于您只想排序,您可以执行以下操作:

var first = model.sortBy('orderNumber').reverse().objectAt(0);

据我所知,在setupControllerredirect之后调用afterModel所以我不确定是否可以通过{{1}从控制器获取已排序的内容}和afterModel挂钩。