2016-04-14 28 views
1

我正在創建一個角度爲2的TranslationPipe,它接受一個字符串作爲輸入,並從TranslationService獲得翻譯並將其返回到視圖。像這樣的例子:觸發器管道重新加載而不改變輸入

<div>{{ 'hello world' | translate }}</div>
變爲:
HEJ韋登

我想辦法改變視圖的語言,並更新頁面上的所有文本,而不需要重新加載整個頁面。有沒有辦法觸發頁面上所有TranslationPipe的重新加載,或者甚至是應用程序中的所有管道?

通常,角度觸發管道的唯一方法是通過更改傳遞給它的變量。輸入是一個字符串,但我需要手動觸發。

文本對象存儲所有的翻譯文本存儲在該服務,所以我知道另一種解決辦法來做到這一點 <div> translationObject['hello world'] </div> 但對設計師較少可讀性。

回答

2

使用pure: false每次對管道進行評估角度運行變化檢測。

@Pipe({ 
    name: 'xxx', 
    pure: false 
}) 

認爲這是相當昂貴的。

另一種方法是將語言作爲附加參數傳遞,然後Angular會在語言更改時評估管道。

+0

像{{'my text'| translate:languageVar}}? – andykais

+0

沒錯。 。 。 。 。 。 –

+1

@GünterZöchbauer我有一個像| filterargs:objectWithProperties。只有當我提到使用不純管道時,纔會評估此管道。然而它非常昂貴。當objectWithProperties中的任何屬性發生更改時,Pipe都不會被評估。 –

2

管道可以有參數,即使你不需要它們(或不是全部)它們的變化觸發器管道transform函數。

// html 
<p class="time-stamp">{{message.sent | timeAgo:trigger}}</p> 

// component 
trigger: number = 0; 

ngOnInit() { 
    setInterval(() => this.trigger = Math.random(), 60 * 1000) 
}