Поле класса динамического создания в ngOnInit() в Angular

Я пытаюсь динамически создавать переменные в классе для хранения значений и использовать их в ngModel и других местах. Я знаю, что могу присвоить значение переменным в ngOnInit() вот так

export class Component implements OnInit{
   name: string;
   ngOnInit(){
       this.name = 'John Doe';
   }
}

Но у меня есть проблема - я получаю свои поля из серверного API и не знаю, что и сколько элементов я получаю. Я могу только анализировать ответ сервера и присваивать значение новым переменным после его получения.

Я не могу сделать это так (TS2540: невозможно назначить «имя», потому что это константа или свойство только для чтения.)

export class Component implements OnInit{
   ngOnInit(){
       name = 'John Doe';
   }
}

Как я могу назначить новые поля моему классу в ngOnInit() или, может быть, в другом месте? (Я думаю, что могу сделать это в конструкторе, но в документации сказано, что я не должен использовать его с Observable вызовом API и другими сложными вещами)


person Denis Savenko    schedule 15.03.2018    source источник


Ответы (2)


Для этого вы можете использовать что-то вроде этого:

ngOnInit() {
  this['prop'] = 'value';
}

Вот ссылка на рабочий пример: https://stackblitz.com/edit/dynamic-class-props

person vince    schedule 15.03.2018
comment
Спасибо за ответ и живой код, я забыл попробовать [] assign! :) - person Denis Savenko; 15.03.2018
comment
Рад, что смог помочь :) - person vince; 15.03.2018

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

export class Component {
    [name: string]: any;
    ngOnInit(){
        this["name"] = 'John Doe';
        this.nameaa = "dd"
    }
}

Однако вы должны быть осторожны, это означает, что вы можете ошибиться в именах свойств, и компилятор не выдаст никакой ошибки.

person Titian Cernicova-Dragomir    schedule 15.03.2018
comment
Спасибо за ваш ответ и внимание к именам свойств с ошибками. - person Denis Savenko; 15.03.2018