ngFor 不会将元素渲染到 IOS 浏览器中

ngFor does not render elements into IOS browsers

我正在尝试学习 Angular 并遵循 here 中描述的示例。它在我的桌面上运行良好(macOS 10.13.3 / Safari 11.0.3;Chrome 64.0)。

但是,当我通过 iphone (ios 11.2.5 / Chrome 64.0) 访问它时 -- 我使用 ng serve --host 0.0.0.0 启动它 --,页面没有完全呈现。

我修改了例子,增加了两个header,如下。正如您在图像中看到的,BOF 和 EOF 已渲染,但其中的 div 未渲染。

搜索,我发现我应该启用 polyfills。我遵循了 here 中的示例。我还修改了 main.ts 并包含了 import './polyfills.ts';

所以我的问题是如何配置 angular 以在两个平台 (desktop/mobile) 上显示内容?

编辑

似乎问题与填充 cars 变量的服务有关。我的组件看起来像:

export class CarListComponent implements OnInit {
  cars: Array<any>;

  constructor(private carService: CarService) { }

  ngOnInit() {
    this.carService.getAll().subscribe(data => {
      this.cars = data;
    });
  }
}

如果我手动填充数组而不是调用服务,则列表会正确呈现...

export const TEMP: any[] = [
  {
    name: 'Car 1'
  }, {
    name: 'Car 2'
  }, {
    name: 'Car 3'
  }
];

然后

  ngOnInit() {
      this.cars = TEMP;
  }

代码将适用于 IOS Safari/Chorme。问题不在于服务,因为如果我使用 console.log(data),它表明它填充了有效信息。我认为问题与 Observable 有关...

<h2>BOF</h2>

<div *ngFor="let car of cars">
  {{car.name}}
</div>

<h2>EOF</h2>

版本:

Angular CLI: 1.6.7
Node: 8.9.4
OS: darwin x64
Angular: 5.2.4
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router

@angular/cdk: 5.2.1
@angular/cli: 1.6.7
@angular/flex-layout: 2.0.0-beta.12
@angular/material: 5.2.1
@angular-devkit/build-optimizer: 0.0.42
@angular-devkit/core: 0.0.29
@angular-devkit/schematics: 0.0.52
@ngtools/json-schema: 1.1.0
@ngtools/webpack: 1.9.7
@schematics/angular: 0.1.17
typescript: 2.5.3
webpack: 3.10.0

听起来可能是变化检测问题。你在使用 ChangeDetectionStrategy.OnPush 吗?如果是这样,那么您需要在更改后手动调用 ChangeDetectorRef markForCheck()。或者您可以尝试使用 async 管道,这将放弃对 markForCheck()

的需要
ngOnInit() {
  this.cars = this.carService.getAll()
}

<h2>BOF</h2>

<div *ngFor="let car of cars | async">
  {{car.name}}
</div>

<h2>EOF</h2>

找到问题了,惭愧...

我的 getAll() 进入 car.service.ts 的方法指向 "localhost"...我只是将其更改为 IP,并且有效....

  getAll(): Observable<any> {
    return this.http.get('//10.10.10.10:8080/cars');
  }