我正在使用angular 17,我从我的API中获取数据,但在收到它之后,模板不更新,我无法显示我的数据.

我的组件服务,我向服务器发送请求:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject, Observable, tap } from 'rxjs';
import { APIBASEURL } from 'app/constants.config';


@Injectable({
  providedIn: 'root'
})
export class DashboardService {

  constructor(
    private http: HttpClient
  ) { }

  getData(): Observable<any> {
    return this.http.get(`${APIBASEURL}/dashboard/links`)
  }


}

我的组件,其中我订阅了前面的方法:

import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { FuseCardComponent } from '@fuse/components/card';
import { DashboardService } from './dashboard.service';
import { Subject, takeUntil } from 'rxjs';
import { MatIconModule, MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser';
// import { CustomIconDirective } from './custom-icon.directive';
import {MatInputModule} from '@angular/material/input'; 
import {MatSlideToggleModule} from '@angular/material/slide-toggle';
import {MatButtonModule} from '@angular/material/button';
import { UserService } from 'app/core/user/user.service';
import { User } from 'app/core/user/user.types';


@Component({
  selector: 'app-dashboard',
  standalone: true,
  encapsulation: ViewEncapsulation.None,
  changeDetection: ChangeDetectionStrategy.OnPush,
  imports: [CommonModule, FuseCardComponent, MatIconModule, MatInputModule, MatSlideToggleModule, MatButtonModule],
  templateUrl: './dashboard.component.html',
})


export class DashboardComponent implements OnInit, OnDestroy {

  data: any;

  private unsubscribeAll: Subject<any> = new Subject<any>();


  constructor(
    private dashboardService: DashboardService,
    private matIconRegistry: MatIconRegistry,
    private domSanitizer: DomSanitizer,
    private _userService: UserService,

  ) { }

  ngOnInit() {

    // Subscribe to the dashboard service
    this.dashboardService.getData().subscribe((data) => {
      this.data = data;
      console.log('subscribe: ', this.data);
    });

    console.log('after: ', this.data)
  }

  ngOnDestroy(): void {
    this.unsubscribeAll.next(null);
    this.unsubscribeAll.complete();
  }

}


之后,在模板中我只是显示我的数据,但它总是空的.

如果我查看控制台中的devtool,我会发现,首先第二个控制台日志(log)显示的是第一个,然后是第二个,数据正确.

经过大量研究,我发现如果我这样做: this.data = this.dashboardService.getData()个 而不是订阅,然后在模板中放置异步 @if(data | async; as data)这行得通,但我想知道为什么订阅行不通.

让你知道我是新的Angular ,这是我的第一个网站.

如我所说,我试过使用第二种方法,但我想知道为什么第一种方法行不通

推荐答案

OnPush更改检测将仅在@input值更改或模板中的可观察边界发出时更新视图.

要解决这个问题,你可以按照@ Jacopo Sciampi的建议手动调用detectChanges.

或者,您可以使用默认更改检测.

或者,你可以保持你的数据是可观察的,并使用pilc管道,这是我发现通常最简单的代码:

export class DashboardComponent {

  data$: Observable<any> = this.dashboardService.getData();

  constructor(
    private dashboardService: DashboardService,
    private matIconRegistry: MatIconRegistry,
    private domSanitizer: DomSanitizer,
    private _userService: UserService,
  ) { }

}
<ng-container *ngIf="data$ | async as data">

  <p> My data </p>
  <pre>{{ data | json }}</pre>

</ng-container>

请注意,如果模板中没有显式订阅,则不再需要管理取消订阅,因此不再需要SubjectngOnDestroy.如果你在声明data$时初始化它,你也不需要ngOnInit.


此外,如果您确实决定需要一些显式订阅(usually in components this is not necessary),则可以利用新的takeUntilDestroyed()操作符:

private sub = this.dashboardService.getData().pipe(takeUntilDestroyed()).subscribe(
   data => this.data = data
);

Javascript相关问答推荐

fetch在本地设置相同来源的cookie,但部署时相同的代码不会设置cookie

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

使用复选框在d3.js多折线图中添加或删除线条

配置WebAssembly/Emscripten本地生成问题

如何将Cookie从服务器发送到用户浏览器

为什么我的getAsFile()方法返回空?

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

触发异步函数后不能显示数据

使用类型:assets资源 /资源&时,webpack的配置对象&无效

try 将Redux工具包与MUI ToggleButtonGroup组件一起使用时出错

无法重定向到Next.js中的动态URL

使用自动识别发出信号(&Q)

JWT Cookie安全性

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时

FindByIdAndUpdate在嵌套对象中创建_id

如何处理不带参数的redux thunk payloadCreator回调函数?

当S点击按钮时,我如何才能改变它的样式?

在每次重新加载页面时更改指针光标

观察子组件中的@Output事件emits 器?