2016-04-12 17 views
0

Я пытаюсь сделать что-то подобное в моих маршрутах: маршрутEmber вложенных глобальные маршрутов (Wildcard)

this.route('products', { path: "/products/*choises"}, function() { 
    this.route('promotion', {path: "/promotion/*offers"}); 
}); 

продукта:

offerPath: function(params){ 
     this.transitionTo('product.promotion', params); 
    } 

Проблема заключается в том, что это не имеет значения, что я посещаю, приложение считается частью маршрута продуктов. Как я могу это сделать? Мне нужно, чтобы они были вложенными.

+0

- выбор продуктов ids? –

+0

Короткий ответ: вы не можете, потому что глобус жадный и будет соответствовать всем до конца пути, как вы видите. – locks

ответ

1

Обновление: Вы можете использовать крючок в маршрутизаторе beforeModel(transition), чтобы проверить, что находится в URL-адресе.

http://example.com/products/manufacturer-209/series-881/tag-17143/none/494822/f беззаконного

import Ember from 'ember'; 

export default Ember.Route.extend({ 

    beforeModel(transition) { 
    console.log(transition.params.products.choises) 
    // if you use this url: http://example.com/products/manufacturer-209/series-881/tag-17143/none/494822/f‌​lawless 
    // console log would be: "manufacturer-209/series-881/tag-17143/none/494822/f‌​lawless" 
    } 

}); 

По крайней мере, у вас есть остальная часть URL таким образом, вы можете отфильтровать важную информацию и перенаправлять с this.transitionTo() на точное место.


Вы могли бы иметь следующий маршрут:

http://example.com/products/123/promotions/456 

или

http://example.com/products/awesome_souce/promotions/monday_deal 

В первом случае, ваш маршрут будет выглядеть следующим образом:

this.route('product', { path: "/products/:product_id"}, function() { 
    this.route('promotion', {path: "/promotions/:promotion_id"}); 
}); 

В второй случай, может быть, вот так:

this.route('product', { path: "/products/:product_name"}, function() { 
    this.route('promotion', {path: "/promotions/:promotion_name"}); 
}); 

Наконец, ваши обработчик маршрута можно загрузить соответствующие модели (пример для первого случая):

// app/routes/product.js 
import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(params) { 
    return this.store.findRecord('product', params.product_id); 
    } 
}); 

--- 

// app/routes/product/promotion.js 
import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(params) { 
    // you can get access to the parent route model if you need for the api query 
    const product = this.modelFor('product'); 
    return this.store.findRecord('promotion', params.promotion_id); 
    } 
}); 

Если вам нужны только из параметров от product маршрута, вместо возврата всей записи, например, вы можете просто return params.product_name, так что у вас будет доступ к строке с this.modelFor('product') на уровне подпрограммы.

+0

Спасибо Zoltan! Суть в том, что мои маршруты сложнее. Например, для продукта: 'http: // example.com/products/manufacturer-209/series-881/tag-17143/none/494822/flawless' И для предложения: ' http:// example.com/products/manufacturer-209/series-881/tag-17143/none/494822/flawless/promotion/494822-flawless-working' Я вложил маршруты, и он отлично работает, но когда я перезаряжаю URL-адрес продвижения, приложение, которое я нахожу в продуктовом маршруте – Wesley

+0

Спасибо! вот что я искал – Wesley

Смежные вопросы