*ngfor не отображать данные в Angular7

Я использую angular7, и вот мой код: в компоненте.тс

import { Component, OnInit } from "@angular/core";
import { FocusAreasService } from "../../services/focus-areas.service";

@Component({
  selector: "app-about",
  templateUrl: "./about.component.html",
  styleUrls: ["./about.component.scss"]
})
export class AboutComponent implements OnInit {
  public canonical: string;
  public RsFocusArea: any[];
  constructor(public focusareaService: FocusAreasService) {}

  ngOnInit() {
    this.canonical = document.location.origin;

    this.focusareaService.getFocusAreaDataWithHttpClient2().subscribe({
      next(response) {
        console.info("HttpClient handle data");
        console.dir(response);

        this.RsFocusArea = response["focusArea"];
       //I print this.RsFocusArea here , it has values 
        console.info("this.RsFocusArea");
        console.dir(this.RsFocusArea);
      },
      error(err) {
        console.error("Error: " + err);
      },
      complete() {
        console.info("Completed");
      }
    });
  }
}

}

и в .html

 <ul class = "col-xs-12 row">
        <li *ngFor = "let area of RsFocusArea" class = "col-xs-12 col-sm-6 col-md-4">{{area}}
        </li>
      </ul>

и литаж не повторялся и дал мне это в структуре тега:

<ul _ngcontent-aly-c5 = "" class = "col-xs-12 row"><!--bindings = {}--></ul>
<!--bindings = {}-->
<ul _ngcontent-aly-c5 = "" class = "col-xs-12 row"><!--bindings = {}--></ul>

Что-то не так с моим кодом? Я подумал, может быть, мне нужно перерисовать страницу, когда я назначу новое значение RsFocusArea в ngOnInit?

RsFocusArea: [1, 2, 3]; должно быть RsFocusArea = [1, 2, 3];
Julian Liu 30.05.2019 05:38

спасибо за поправку, я тоже это заметил. но все еще не работает, когда я меняю его на RsFocusArea = [1, 2, 3];

Shinji035 30.05.2019 05:42

где .id и .link определены в RsFocusArea

Ganesh Gudghe 30.05.2019 05:42

Вам нужно использовать вот так. RsFocusArea = [ {id:'myid, ссылка:'mylink'}, ];

Sanjay 30.05.2019 05:44

@GaneshGudghe, я удаляю избыточный код, проблема в том, что он не будет повторять тег <li>, даже RsFocusArea представляет собой массив жесткого кода.

Shinji035 30.05.2019 05:45

хорошо, теперь проверьте, будет ли работать проверьте этот stackblitz.com/edit/angular-aphc1x

Ganesh Gudghe 30.05.2019 05:47

Код не имеет никаких проблем, возможно, классы, которые вы используете, могут вызывать некоторые проблемы. попробуйте удалить эти классы, а @GaneshGudghe уже запустил пробный запуск.

Deepender Sharma 30.05.2019 05:56
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
7
121
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

RsFocusArea = [1, 2, 3];

В шаблоне:

<li *ngFor = "let area of RsFocusArea" class = "col-xs-12 col-sm-6 col-md-4">
     {{area}}
</li>

https://angular-bchmnn.stackblitz.io

Надеюсь, это решит вашу проблему.

спасибо за ваше решение, я попробовал, работает хорошо. Я обновил свой вопрос. в реальной сцене мы получаем данные с сервера и назначаем их свойству. на данный момент жесткий код работает хорошо. но если я получаю данные с сервера, они снова не работают. Я напечатал данные в next(response) , они не нулевые. так что, может быть, мне следует перерисовать страницу после присвоения данных свойству?

Shinji035 30.05.2019 06:03

Не могли бы вы опубликовать ответ сервера?

Pramod Kharade 30.05.2019 06:28
Ответ принят как подходящий

Проблема в подписке

Дело в том, что вы никогда не устанавливаете переменную, которую вы действительно хотите, this.RsFocusArea из вашего компонента никогда не получает значение, переменная this.RsFocusArea, которую вы вызываете в своей подписке, находится в области действия функции next(response){}.


Использование next(response){...} в вашем subscribe() приведет к тому, что ключевое слово this будет ссылаться на функцию next(response){}, что означает, что this.RsFocusArea больше не ссылается на переменную вашего компонента, а вместо этого ищет неопределенную переменную.

(Пояснение здесь: Подписка на Angular2 понимает функцию стрелки)

Вкратце: ключевое слово this может быть сложным внутри других функций.

Починить это:

Вместо этого попробуйте написать свой subscribe с помощью стрелочных функций:

this.focusareaService.getFocusAreaDataWithHttpClient2().subscribe(
  response => {
    console.info("HttpClient handle data");
    console.dir(response);

    this.RsFocusArea = response["focusArea"];
    //I print this.RsFocusArea here , it has values 
    console.info("this.RsFocusArea");
    console.dir(this.RsFocusArea);
  },
  err => {
    console.error("Error: " + err);
  },
  () => {
    console.info("Completed");
  }
});

Если вы действительно хотите использовать нотацию next(), вы можете посмотреть, как связать функцию.

Надеюсь, поможет

О боже!, я писал ответ, который разместил здесь Джоджофулк. По крайней мере, я объясню вам, почему это происходит, в меньшем количестве слов. Стрелочные функции сохраняют контекст, в котором они были объявлены, с другой стороны, объявления функций сохраняют локальную область видимости.

Когда вы делаете это:

{
    ...
    this.RsFocusArea = response["focusArea"];
}

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

Другие вопросы по теме