我有这个Angular 代码:

<mat-table [dataSource]="myData">

<ng-container matColumnDef="abc">
   <mat-header-cell *matHeaderCellDef>Abc</mat-header-cell>
   <mat-cell *matCellDef="let myData" [style.color]="getColor(myData.myVal)">{{ myData?.myVal }}</mat-cell>
</ng-container>

</mat-table>

.ts

  @Input() myData: MyData[] = [];

  standardColor:string = '';
  warningColor:string = '';

  constructor(
    ...
  ) {   
    this.getSettings();
  }
  
  
  getSettings(){
   this.settings$ = this.settingsService.getSettings()
      .pipe(shareReplay(),
        catchError(error => {
          this.onError();
          return of({} as setting);
        })
      );

      this.settings$.subscribe(result => { 
        this.standardColor = result.standardColor;
        this.warningColor = result.warningColor;
      });
  } 
  
  
  getColor(myVal: number){
    if(myVal > 0){
      return this.standardColor;
    } else {
      return this.warningColor;
    } 

  }

当在mat-cell中执行getColor时,它返回空字符串.

相反,它应该返回来自可观察对象的值(第this.standardColor = result.standardColor;行).

这是因为this.sets$Observable是异步的,并且在html模板之后执行.

了解这一点通常通过将管道异步(|Asynch)添加到模板来解决.

但在本例中,它是一个不同的可观察对象(设置$),而不是模板绑定中的数据源(Mydata).

推荐答案

也许您可以将getSetting()转换为可观察的方法,然后等待它返回设置,然后再显示您的数据:


myWarningColor: string = '';
myStandarColor: string = '';
settings$ = this.getSettings();

getSettings(): Observable<boolean> {
  return this.settingsService.getSettings().pipe(
    shareReplay(),
    catchError((error) => {
      return of({} as any);
    }),
    tap((result) => {
      this.myWarningColor = result.warningColor;
      this.myStandarColor = result.standardColor;
    }),
    switchMap(() => of(true))
  );
}

然后在模板中:

    <div *ngIf="settings$ | async">
      <div *ngFor="let item of myData">
        <span [style.color]="this.getColor(item.myVal)">{{ item.myVal }}</span>
        <span [style.color]="this.getColor(item.myVal)">COLOR</span>
      </div>
    </div>

当然,这意味着您必须等待设置方法返回,然后才能显示任何数据,但另一方面,如果您没有设置,您将显示错误的 colored颜色 编码.

判断此工作示例:https://stackblitz.com/edit/stackblitz-starters-7fn78y?file=src%2Fmain.ts

Angular相关问答推荐

导入浏览器模块时出错已导入commonModule的insted,animationBrower也显示错误,当p打开时

PrimeNG侧栏清除primeNG消息.为什么?

如何跨不同组件使用ng模板

基于另一个控制值显示值的Angular 数组

ANGLING HTTP.GET()返回包含数据的数组

HTTP拦截器在Angular 17项目中不起作用

npm install命令在基本Angular 应用程序的天蓝色构建管道中失败

Angular Http 拦截器 - 修改标头会导致 CORS

如何根据响应变化更改 Angular Carousel 的cellsToShow

Angular 15:在范围内提供相同标记时附加到提供的值

无法使用@ngrx/component-store 在其他组件中获取状态更改值

Angular 13 Sass 模块无法在编译中正确导入文件

iss 声明无效 Keycloak

Springboot/Angular2 - 如何处理 HTML5 url?

如何测试 Angular2 的 router.navigate?

如何在 Angular CLI 1.1.1 版中将路由模块添加到现有模块?

Angular 2 Material Design 组件是否支持布局指令?

Angular2 - 从外部验证和提交表单

在 2 个模块之间共享组件

如何将从后端渲染的参数传递给angular2 bootstrap 方法