Ember.js 未指定子例程时重定向

Ember.js 未指定子例程时重定向,ember.js,ember-router,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.or

我有一组嵌套管线和模板,如果未指定子管线,我希望自动选择第一个模型。路线结构为:

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\u id
时,无论发生什么
:order\u id
都会出现问题,因为用户总是被重定向到
orders
数组中的第一个订单

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

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')
});
这表明了我的问题

命中将始终重定向到数组中的第一个顺序(在本例中为4)

我需要它保持深链接的url,只有重定向时,没有指定订单


我感觉和我想做的都很相似,只是如果没有指定子路由,两个地址都不会自动选择第一项。

您应该在SalesOrdersIndex路由中执行重定向。只有当每个路由的附加索引路由与完整的URL映射匹配时,才会创建该路由的附加索引路由。因此,对于任何不完全是“销售/订单”的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:

如果用户试图访问
sales.orders.index
路径,可以选择在afterModel钩子上检查转换并重定向

大概是这样的:

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

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

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

据我所知,
setupController
是在
redirect
afterModel
之后调用的,因此我不确定是否可以通过
afterModel
redirect
挂钩从控制器获取排序内容。

@bavo van让你搞定它!我在我的应用程序中调整了路线(比我的示例稍微复杂),它工作得非常好!谢谢我很高兴能帮上忙;-)