2015-12-21 68 views
6

因此,假設我們有一個簡單的對象,它包含兩種不同語言的字符串,如
welcomeText = {"de": "Willkommen zurück!", "en": "Welcome back!"}angular2 elvis操作符和括號表示法/通過鍵訪問對象

welcomeText是保存所有文本,並得到異步傳輸 (所以我需要照顧可能未定義的值,因此貓王運營商)Texts對象的屬性。 現在,在我的angular2模板中,我想根據當前所選語言顯示文本。
這是工作(但不是我所需要):

.. 
{{Texts?.welcomeText?.de}} // works, as well as {{Texts?.welcomeText?.en}} 
.. 

什麼,我想是這樣的(因爲語言可以改變):

.. 
{{Texts.?welcomeText?[language]}} 
.. 

不幸的是這將導致一個錯誤:

EXCEPTION: Template parse errors: 
Parser Error: Conditional expression 
     {{Texts?.welcomeText?[language]}} 
    requires all 3 expressions at the end of the expression .. 

不知道如何解決這個錯誤。我只是不確定我是否錯誤地使用了它,或者它只是不打算如此工作。目前我使用一個簡單的解決方法,但我覺得它是有點難看,因爲我有一個方法調用,無論我想要顯示的文字:

.. 
{{getText('welcomeText')}} 
.. 
.. 
getText(name : string){ 
if(this.Texts) 
    return this.Texts[name][this.language] 
.. 

這只是走的路還是有辦法按照我想要的方式與貓王操作員一起操作?
非常感謝任何答案!

回答

0

我有一種感覺,你想在這裏做什麼實際上不可能肯定沒有什麼關於它的template syntax頁面上。

爲了什麼它的價值,我不認爲有什麼實際上你錯了想出來的解決方案,它可能是我會如何解決這個問題我自己。

編輯:另外值得一提的是折角2的國際化和本地化功能都尚未實現,我會繼續關注這個功能來解決這個問題

0

我遇到同樣的問題,而埃爾維斯呢?運算符在這個線程中被引入:https://github.com/angular/angular/issues/791現在它已關閉,@lgalfaso建議將它擴展爲包括?[和?(

在我的書中它應該支持這一點,主要是因爲解決方法是一件乏味的事情。

2

其實,我結束了使用自定義的「航行安全」管,因爲在我的情況下空檢查和方括號鏈漸漸方式來長角的?.運營商將不適合進入[]約束。

import { Pipe } from '@angular/core'; 
import { path } from 'ramda'; 

@Pipe({name: 'safe'}) 
export class SafeNavigationPipe { 
    transform(propertyPath: any[], source: any) { 
     return path(propertyPath, source); 
    } 
} 

path function做所有的工作 - retriev es數據在給定的路徑,並返回undefined路徑無法解析。

並且可以使用這樣的:

{{ [userId, dayIdx, shiftIdx, 'status'] | safe:usersList }} 

凡陣列項目可以是動態值。