Типичный скрипт, повторяющий объект, не работает (ошибка типа) - PullRequest
0 голосов
/ 18 июня 2020

Я уже некоторое время пытаюсь, но не могу заставить его работать.

Я пытаюсь перебрать массив в объекте (интерфейс импортирован):

export interface Ex {
    _id: string;
    name: string;
    tags: [
        {
            label: string,
            count: number,
            updateInfo: [
                {
                    date: string,
                    delay: number,
                }
            ],
        }
    ];
}

В основном я пытаюсь поместить все метки тегов в массив строк.

getTags(): void {
    for (let tag in this.ex.tags) {
      this.tags.push(tag.label)
    }
}

или вот так:

getTags(): void {
    this.ex.tags.forEach(tag => {
      this.tags.push(tag.label);
    });
  }

Но я получаю сообщение об ошибке:

core. js: 6228 ОШИБКА Тип Ошибка: не удается прочитать «теги» свойств неопределенного значения

1 Ответ

0 голосов
/ 18 июня 2020

Вы определили tags, но не создали / или не присвоили ему:

Добавление свойства как:

tags = [];

или

tags = new Array<string>();

должно разрешить проблема.

Кроме того, вы можете немного упростить свой лог c:

this.tags = this.exTags.tags.map(x => x.label);

И пример того, что я вижу

    export class AppComponent implements OnInit  {
  name = 'Angular ' + VERSION.major;

  getTags() :Observable<Ex>{
    return new Observable(ob => {
      setTimeout(() => {
        ob.next({
            id :"a",
    name: "a name",
    tags: [
      {
      label:"a label",
      count:1,
      updateInfo: [
        {
        date: new Date().toString(),
        delay:5
        }
      ]
    },
    {
      label:"b label",
      count:1,
      updateInfo: [
        {
        date: new Date().toString(),
        delay:5
        }
      ]
    }

    ] 
        })
      },1000)

    })
  }

  exTags: Ex;

  tags = new Array<string>();
  ngOnInit(){
      this.getTags().subscribe(s => { this.tags = s.tags.map(x => x.label)});
  }

}

export class Tag{
  label: string;
  count: number;
  updateInfo: [
          {
          date: string,
          delay: number
          }
    ]
}
export interface Ex {
        id: string,        
        name: string,
        tags: Tag[]
}

Edit


Поскольку у вас есть OBservable, вам нужно дождаться завершения запроса на получение. Я издевался над сетевым asyn c с таймаутом для объекта asyn c (обновлен Stackblitz)

Тогда все, что вам нужно, это вызвать метод подписки на AJAX / Observable:

this.getTags().subscribe(s => { this.tags = s.tags.map(x => x.label)});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...