2016-06-21 4 views
0

Я пытаюсь связать вычисляемое свойство (или изменить через наблюдателя) динамический сегмент iso в маршруте locale. Маршрутизатор у меня представлен:Связывание с динамическим сегментом маршрута

this.route('locale', { path: '/:iso' }, function(){ 
    this.route('products', function() { 
     this.route('single', { path: '/:id/:seoName' }); 
    }); 
}); 

что приводит к URL, как это:

http://localhost:4200/en-us 
http://localhost:4200/en-us/products 
http://localhost:4200/en-us/products/123/product-name 

Что мне интересно, есть ли способ программно изменить en-us часть URL нет вопрос, на каком пути вы находитесь? Моя проблема до сих пор с запуском transitionTo() заключается в том, что я не знаю, что такое подпункт маршрута из текущего местоположения.

В принципе, мне нужен способ привязки сегмента en-us к вычисленному значению, которое я могу обновить автоматически при его изменении.

Заранее благодарен!

EDIT:

Для дальнейшего уточнения, я ищу способ, чтобы обновить сегмент URL когда свойство изменяет. Что-то вроде этого:

+0

У вас есть в вашем маршруте refreshModel: верно определены для изо пары? Я могу предоставить пример передачи вычислимого свойства контроллеру на основе iso, но это то, что вы хотите? –

+0

@MirzaMemic no? Можете ли вы привести пример? Это звучит многообещающе: D – ShadowPuppet

+0

В качестве продолжения это не для параметра запроса, указанного как '? Iso = en-us', а для фактического сегмента маршрута в самом URL-адресе. – ShadowPuppet

ответ

0

Хорошо, вот как вы можете передать параметр вашему контроллеру, а затем установить для него вычисленное свойство.

Первый маршрут

export default Ember.Route.extend({ 
    iso: null, 
    queryParams: { 
    iso: { 
     refreshModel: true 
    } 
    }, 
    model(params) { 
    this.set('iso', params.iso); 
    return this.store.query('product', params); // do your query here to fetch products based on iso or whatever 
    }, 
    setupController(controller, model) { 
    controller.set('iso', this.get('iso')); 
    } 
}); 

Так что я здесь - я сделал парам модель изо обновления - при его изменении модель будет перезагрузить. Это необязательно. Также на этом пути я создал свойство iso для сохранения его значения, поскольку модель выполняется до setupController. Это всего лишь трюк, чтобы позже передать его значение контроллеру.

Теперь у вас есть значение iso из params в контроллер, и оттуда вы можете создать вычисленное свойство из этого значения. Что-то вроде этого:

export default Ember.Controller.extend({ 
    iso: null, //it will be set by its router 
    isoComputed: Ember.computed('iso', function() {}) //do here a computed based on iso prop 
} 

Это способ перейти от маршрутизатора Params к контроллеру и внутри контроллера установлен вычисляемым, который вы можете использовать в шаблонах.

Обратите внимание, что это то, что вы хотели, но я надеюсь, что это поможет. Дайте мне знать ...

EDIT

Обновленное вопрос имеет больше смысла.Я думаю, что вы можете иметь вычисляемые собственности на службе, и сделать редирект после его изменений, так что-то вроде этого

export default Ember.Controller.extend({ //you can do this on a route or controller 
localization: Ember.inject.service('localization'), 
locale: Ember.computed.oneWay('localization.locale'), 
redirect: Ember.computed('locale', function() { 
    let locale = this.get('locale'); 
    if(locale === "fr-FR") { 
    this.transitionTo('products', { queryParams: { iso: 'fr-FR' }}); //you can redirect to whatever 
    } 
}) 

}

EDIT 2:

После еще объекта службы мышления следует хранить значения перехода. Эта часть должна быть перемещена в Mixin, поэтому ее легко реализовать на каждом вложенном маршруте. Затем Перенаправление после опоры изменяется, хранится в службе, чтобы другой реквизит, как это:

params: Ember.computed.oneWay('localization.params'), 
//inside redirect 
this.transitionTo(...queryParams:{ this.get('params') }).... 
+0

Я видел ваш комментарий позже, но вы можете использовать эту логику для любого параметра, который вы определили в своем маршруте. Трюк здесь заключается в том, что в Route, который является просто объектом ember, я сохраняю значение, которое я читал из параметров внутри модели, а затем передавал контроллер в setupController. После этого настройка, вычисленная на контроллере, проста, –

+0

Правильно это работает, переходя из URL -> Property. Мне нужно свойство -> URL. Я добавил дополнительные примечания к OP. Надеюсь, это имеет смысл :) Спасибо – ShadowPuppet

+0

Это ближе, но он не будет работать с вложенными маршрутами. Например, если мы находимся в: http: // localhost: 4200/en-us/products/123/product-name' и изменениях локалей, мне нужно сохранить оставшуюся часть URL-адреса и просто обновить 'en -us' к новому значению. Т.е., путь 'transitionTo()' будет переменным в зависимости от того, к какому маршруту мы подключаемся ... – ShadowPuppet

-1

Таким образом, после нелепого количества проб и ошибок, я остановился на делать replaceWith() на маршрутизаторе в сочетании с регулярным выражением для замены из старого iso с новым. Я закончил с этим:

/** 
* Locale changed 
* 
* @return {null} 
*/ 
localeChanged: function(){ 
    const locale = this.get('i18n.locale'); 
    const router = this.get('routing.router'); 

    var pathname = location.pathname.replace(/^\/[a-z]{2}-[a-z]{2}\//gi,'/' + locale + '/'); 
    router.replaceWith(pathname); 
}.observes('i18n.locale').on('init') 

Который затем берет полный URL и перенаправляет соответственно где:

http://localhost:4200/en-us/products/category/6/best-sellers 
http://localhost:4200/en-us/products 

становится

http://localhost:4200/fr-ca/products/category/6/best-sellers 
http://localhost:4200/fr-ca/products 
+0

Эта реализация использует наблюдателей. Не рекомендуется использовать их, поскольку они предназначены только для внутреннего api. –

+0

False. Наблюдатели являются частью документальных руководств для последнего Ember. Они не только внутренние. https://guides.emberjs.com/v2.6.0/object-model/observers/ Вычисленное свойство здесь не подходит, так как свойство никогда не открывается, поэтому вычисление никогда не произойдет. Поскольку это не является чем-то свойством, наблюдатель имеет больше смысла наблюдать за изменением и воздействовать на него. – ShadowPuppet

+0

Только для справки, если вы посмотрите на документ Ember, говорится: «Наблюдатели часто чрезмерно используются новыми разработчиками Ember. Наблюдатели в значительной степени используются внутри самой системы Ember, но для большинства проблем, с которыми сталкиваются разработчики приложений Ember, рассчитанные свойства являются подходящим решением . ". Это непосредственно из документации. Я также рекомендую вам посмотреть это видео https://www.youtube.com/watch?v=7PUX27RKCq0, которое в основном объясняет мою мысль. Но вы можете использовать все, что хотите. Я просто пытался помочь. веселит. –