Angular2 оператор elvis и нотация/привязка к кронштейну/доступ к объекту по ключу

Итак, скажем, у нас есть простой объект, который содержит строку для двух разных языков, например, welcomeText = {"de": "Willkommen zurück!", "en": "Welcome back!"}.

welcomeText является свойством объекта Texts, который содержит все тексты и получает асинхронно (поэтому мне нужно позаботиться о возможных значениях undefined, следовательно, о работе elvis). Теперь, в моем шаблоне 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]
..

Это просто путь, или есть способ сделать это так, как я хочу, с помощью оператора elvis?
Большое спасибо за любые ответы!

Ответ 1

Я фактически закончил использование настраиваемого канала "надежной навигации", так как в моем случае цепочка нуль-чеков и квадратных скобок уходила в длину, а оператор Angular ?. не вписывался в ограничение [].

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 выполняет все задание - извлекает данные по указанному пути и возвращает undefined, как только путь не может быть разрешенным.

И может использоваться следующим образом:

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

Если элементы массива могут быть динамическими значениями.

Ответ 2

Я столкнулся с той же проблемой, и пока Элвис?. оператор был введен в этой теме: https://github.com/angular/angular/issues/791 теперь закрыт, @lgalfaso предложил расширить его, чтобы включить? [и? (

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

Ответ 3

Я думаю, что более простым решением для вашего случая было бы использование троичного оператора, например:

{{ Texts && Texts.welcomeText ? Texts.welcomeText[language] : '' }}

Вы можете проверить его путь к желаемому значению, и для этого не нужно вызывать функцию.

Ответ 4

Вы можете сделать что-то вроде:

{{(Texts.?welcomeText || {})[language]}}

так что в основном вы говорите "Get Me WelcomeText или пустой объект" - это всегда будет возвращать объект. Тогда вы можете получить любую недвижимость.

Ответ 5

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

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

Изменить: Также стоит отметить, что функции I18n и L10n Angular 2 еще не реализованы, я остался настроен для этой функции, чтобы решить проблему.