我有一组嵌套路由和模板,如果没有指定子路由,我想自动选择第一个模型。路线结构是:
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 question和this question都与我尝试做的相似,但如果没有指定子路由,则两个地址都不会自动选择第一项。
答案 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);
}
}
这不适用于setupController
,因为setupController
挂钩无法访问转换。在您的情况下,由于您只想排序,您可以执行以下操作:
var first = model.sortBy('orderNumber').reverse().objectAt(0);
据我所知,在setupController
和redirect
之后调用afterModel
所以我不确定是否可以通过{{1}从控制器获取已排序的内容}和afterModel
挂钩。