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 の一部を変更する方法があるかどうかということです。これまでのところ、 a を実行するだけの問題transitionTo()は、現在の場所からサブルートが何であるかを知る方法がないことです。

基本的にen-us、URL が変更されたときに自動的に更新できる、計算されたプロパティにセグメントをバインドする方法が必要です。

前もって感謝します!

編集:

さらに明確にするために、プロパティが変更されたときにURL セグメントを更新する方法を探しています。このようなもの:

4

2 に答える 2

0

わかりました、これがコントローラに param を渡し、計算されたプロパティを設定する方法です。

最初のルート

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'));
  }
});

だから私がここでやったこと - 私は param iso refresh モデルを作りました - モデルが変更されるとリロードされます。これはオプションです。また、このルートでは、setupController の前にモデルが実行されるため、その値を格納するプロパティ iso を作成しました。これは、後でその値をコントローラーに渡すための単なるトリックです。

これで、params からコントローラーへの値 iso が得られ、そこから、この値から計算されたプロパティを作成できます。このようなもの:

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
}

これは、ルーターのパラメーターからコントローラーに渡す方法であり、コントローラー内で、テンプレートで使用できる計算されたセットを設定します。

これがあなたが望んでいたものかどうかを確認してください。お知らせ下さい...

編集

あなたの更新された質問はより理にかなっています。サービスに計算されたプロパティがあり、変更後にリダイレクトを実行できると思うので、このようなものです

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
   }
})

}

編集2:

さらに考えた結果、サービス オブジェクトは遷移値を格納する必要があります。この部分は、ネストされた各ルートで簡単に実装できるように、Mixin に移動する必要があります。次に、小道具が変更された後のリダイレクトがサービスに保存されるため、次のような別の小道具:

params: Ember.computed.oneWay('localization.params'),
//inside redirect
this.transitionTo(...queryParams:{ this.get('params') } )....
于 2016-06-21T20:00:30.573 に答える
-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
于 2016-06-21T22:10:00.663 に答える