Получить дочерний компонент в виде строки

Для компонента, подобного I18n, я хочу, чтобы содержимое компонента в виде строки имело запасное значение, в случае, если моя служба I18n не получает ничего, это значение должно быть запасным.

I18n сервисget метод:

public get(key:string,
               defaultValue?:string,
               variables:Variables = {},
               domain?:string):string {

        for (let catalogue of this.catalogues) {
            if (catalogue.getDomains().indexOf(domain) >= 0
                && catalogue.getLocale() == this.locale
                && catalogue.hasKey(key)) {
                return I18n.setVariables(catalogue.get(key, domain, defaultValue).value, variables);
            }
        }
        return defaultValue;
    }

I18nComponent:

@Component({
    selector: "i18n",
    template: "{{text}}",
})
export class I18nComponent implements OnInit {

    constructor(private i18n:I18n) {
    }

    @ContentChild() content:string; //Here, I want to store actual value as fallback one.

    @Input('key') key:string;

    @Input('domain') domain:string;

    @Input('variables')
    variables:Variables = [];

    @Input("plural")
    plural:number;

    text:string;

    ngOnInit():any {
        console.log(this.content); //Here I get 'undefined'
        if (this.plural !== undefined && this.plural != null) {
            this.text = this.i18n.get(this.key, this.content, this.variables, this.domain);
        } else {
            this.text = this.i18n.getPlural(this.key, this.plural, this.content, this.variables, this.domain);
        }
    }
}

пример использования:

<i18n key="FOO_KEY" domain="stackoverflow">I'm the default value !</i18n>

я знаю<ng-content></ng-content> работает, но только на шаблонной логике, мне нужен способ получить дочернюю как строку в машинописи.

Уже пробовал@ContentChild(String) но я получилundefined.

Другим способом было бы сделать это как строку «Загрузка ...», которую вы можете иметь в базеapp компонент в индексе, действующий как заполнитель, пока вы не загрузите все. Я мог бы сделать то же самое для I18n, пусть здесь держатель шнурка, пока я не получу что-то от службы, чтобы заменить его, но я не знаю, как этого добиться.

 Supamiu02 июн. 2016 г., 09:48
@ GünterZöchbauer Я обновил вопрос, чтобы привести полный пример.
 Günter Zöchbauer01 июн. 2016 г., 18:38
Можете ли вы добавить полный пример. Я не понимаю из твоего вопроса, что именно ты пытаешься сделать.
 Günter Zöchbauer01 июн. 2016 г., 17:57
Я не понимаю, чего вы пытаетесь достичь. Как это связано с вашим сервисом I18n? Почему бы просто не поместить запасное значение в класс, а затем связать его со службой и, если не доступно, с запасным вариантом?
 Supamiu01 июн. 2016 г., 18:36
Я не могу установить запасное значение в классе, потому что оно не всегда одинаково. У меня есть один запасной вариант для каждого использования компонента i18n, и он может включать HTML-теги. (пример:<i18n key="WIN"><b>You</b> won</i18n> -> отступление =<b>You</b> won). Откат здесь "на всякий случай", тогда, если я не получу значение через сервис, я выведу английский (резерв).

Ответы на вопрос(1)

Решение Вопроса

Вы не можете использовать@ContentChildren() чтобы получить весь контент. Вы можете добавить переменную шаблона и запросить ее имя:

<i18n key="FOO_KEY" domain="stackoverflow"><span #myVar>I'm the default value !</span></i18n>
@ContentChild('myVar') myVar;

ngAfterContentInit() {
  console.log(this.myVar.nativeElement.innerHTML);
}

myVar не будет инициализирован раньшеngAfterContentInit() называется.

альтернативно@ContentChild() (или же@ContentChildren()) вы можете запросить тип компонента, как

    <i18n key="FOO_KEY" domain="stackoverflow"><my-comp>I'm the default value !</my-comp></i18n>

@ContentChild(MyComponent, {read: ElementRef}) mycomp;

ngAfterContentInit() {
  console.log(this.myVar.nativeElement.innerHTML);
}

Я думаю, что этот подход будет работать лучше для вас подход

@Component({
    selector: "i18n",
    template: "<div #wrapper hidden="true"><ng-content></ng-content><div>{{text}}",
})
export class I18nComponent implements OnInit {

    constructor(private i18n:I18n) {
    }

    @ViewChild('wrapper') content:ElementRef; //Here, I want to store actual value as fallback one.

    @Input('key') key:string;

    @Input('domain') domain:string;

    @Input('variables')
    variables:Variables = [];

    @Input("plural")
    plural:number;

    text:string;

    ngAfterViewInitInit():any {
        console.log(this.content.nativeElement.innerHTML);
        if (this.plural !== undefined && this.plural != null) {
            this.text = this.i18n.get(this.key, this.content, this.variables, this.domain);
        } else {
            this.text = this.i18n.getPlural(this.key, this.plural, this.content, this.variables, this.domain);
        }
    }
}

Если вы хотите, чтобы пользователи вашегоi18n компонент, чтобы иметь возможность использовать угловые привязки, компоненты и директивы в контенте, который они передают<i18n>Затем он должен обернуть его в шаблон.

    <i18n key="FOO_KEY" domain="stackoverflow">
      <template>
        I'm the {{someName}}!
        <my-comp (click)="doSomething()"></my-comp>
      </template>
    </i18n>

как объяснено вhttps://stackoverflow.com/a/37229495/217408

 Ron Newcomb18 авг. 2017 г., 00:53
Странно, пришлось поставить{{text}} в передней части шаблона вместо конца.

Ваш ответ на вопрос