2016-06-21 250 views
0

我試圖綁定計算屬性(或通過觀察者更改)locale路由中的iso動態段。綁定到動態路由段

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

導致的網址是這樣的:我有路由器被表示爲

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

什麼我不知道是如果有任何辦法以編程方式更改URL的en-us部分沒有你在哪條路線上?到目前爲止,我剛剛運行transitionTo()的問題是,我無法知道當前位置的子路線是什麼。

基本上,我需要一種方法將en-us段綁定到一個計算的屬性,我可以在更改時自動更新URL。

在此先感謝!

編輯:

爲了進一步澄清,我正在尋找一種方式來更新URL段當一個屬性更改。事情是這樣的:

+0

你有你的路線refreshModel:爲ISO真正定義PARAM?我可以提供一個基於iso傳遞計算屬性給控制器的例子,但這是你想要的嗎? –

+0

@MirzaMemic no?你能舉個例子嗎?這聽起來很有希望:D – ShadowPuppet

+0

作爲後續工作,這不是查詢參數指定爲'?iso = en-us',而是針對URL本身中的實際路徑段。 – ShadowPuppet

回答

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刷新模式 - 當它改變時模型會重新加載。這是可選的。同樣在這條路線上,我創建了一個屬性iso來存儲它的值,因爲模型在setupController之前執行。這只是後來將其價值傳遞給控制器​​的一個技巧。

現在你已經從參數值控制器,從那裏你可以從這個值創建一個計算屬性。事情是這樣的:

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傳遞給控制器​​和內部控制器設置的計算機,你可以在你的模板中使用的一種方式。

請注意,如果這是你想要的,但我希望它有幫助。讓我知道...

編輯

您更新的問題更有意義。我想你可能會對服務計算的屬性,並將其改變後進行重定向,所以像這樣

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') }).... 
+0

我後來看到您的評論,但您可以將此邏輯用於您在路由中定義的任何參數。這裏的技巧是在Route上,它只是一個支持對象,我臨時存儲的值是從模型中的params中讀取的,然後傳遞給setupController中的控制器。之後,在控制器prop上計算出來的設置很容易, –

+0

正確的作品從URL - > Property。我需要的是Property - > URL。我已向OP添加了更多註釋。希望這是有道理:)謝謝 – ShadowPuppet

+0

更接近,但它不會與嵌套的路線。例如,如果我們位於:'http:// localhost:4200/en-us/products/123/product-name'並且語言環境發生變化,我需要能夠保留URL的其餘部分並更新'en -us'到新值。即'transitionTo()'路線會根據是可變的我們是在哪條路線... – ShadowPuppet

-1

所以試錯的離譜量之後,我已經在做路由器用正則表達式組合在一個replaceWith()交換解決用新的iso去掉舊的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

錯誤。觀察者是最新Ember文檔指南的一部分。他們不只是內部的。 https://guides.emberjs.com/v2.6.0/object-model/observers/ 作爲屬性從未訪問,因此計算不會出現的一個計算的屬性不適合這裏。由於這不是任何事物的屬性,觀察者更有意義地觀察變化並採取行動。 – ShadowPuppet

+0

只爲參考,如果你看一下灰燼DOC它指出「觀察家往往是過度使用新的灰燼開發。觀察家們大量使用灰燼框架本身,但灰燼應用程序開發人員面臨的大多數問題,計算性能是合適的解決方案「。這是直接來自文檔。我也建議你看看這個視頻https://www.youtube.com/watch?v=7PUX27RKCq0這基本上解釋了我的觀點。但你可以使用任何你想要的。我只是想幫忙。乾杯。 –