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