【问题标题】:Angular template renders before dynamic dataAngular 模板在动态数据之前呈现
【发布时间】:2018-03-21 16:38:25
【问题描述】:

我遇到了一个非常烦人的问题——页面在我获取数据之前呈现。在 $(document).ready() 中,名称已正确记录,并且控制台中没有错误。但是显示的html是空的,刷新页面后显示正确的数据。

这是我的 component.ts 文件:

import {Component} from '@angular/core';
import {DataService} from '../../services/data.service';
import {ActivatedRoute, Router} from '@angular/router';
import * as $ from 'jquery/dist/jquery.min.js';
import 'jquery-ui/jquery-ui.min.js';

declare let jQuery: any;

@Component({
  selector: 'user-header',
  templateUrl: '../../templates/plan/header.html',
})
export class HeaderComponent {

  data;
  selectedCompany;
  selectedPlace;

  constructor(private dataService: DataService,
              private router: Router,
              private route: ActivatedRoute) {
    this.data = this.route.parent.snapshot.data;
    this.selectedCompany = this.data.companies[0];
    if (!this.dataService.selectedPlace.getValue()) {
      this.dataService.selectedPlace = this.selectedCompany.foodHandlingPlaces[0];
    }
    this.selectedPlace = this.selectedCompany.foodHandlingPlaces.filter(
        x => x.id === this.dataService.selectedPlace.getValue().id
    )[0];
    if (!this.selectedPlace) {
      this.selectedPlace = this.selectedCompany.foodHandlingPlaces[0];
    }

    const self = this;
    $(document).ready(function () {
      console.log('selectedCompany', self.selectedCompany.name);
      console.log('selectedPlace', self.selectedPlace.name);
    });
  }

这是我的模板 (html) 文件的一部分:

<li class="dropdown">
  <select [(ngModel)]="selectedCompany" (change)="selectCompany()" id="company-select">
    <option *ngFor="let company of data.companies" [ngValue]="company">
      {{ company?.name }}
    </option>
  </select>
</li>
<li class="dropdown">
  <select [(ngModel)]="selectedPlace" (change)="selectPlace()" id="place-select">
    <option *ngFor="let place of selectedCompany.foodHandlingPlaces" [ngValue]="place">
      {{ place?.name }}
    </option>
  </select>
</li>

如何让html等待数据再渲染?

提前致谢!

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    停止
    使用
    JQUERY
    使用 角度

    我说的还不够。 JQuery 是为操作 DOM 而设计的,你不应该在 Angular 中这样做。

    如果您想等待数据加载,请在 HTML 模板中使用条件。

    <li class="dropdown" *ngIf="selectedCompany && data.companies">
      <select [(ngModel)]="selectedCompany" (change)="selectCompany()" id="company-select">
        <option *ngFor="let company of data?.companies" [ngValue]="company">
          {{ company?.name }}
        </option>
      </select>
    </li>
    <li class="dropdown" *ngIf="selectedPlace && selectedCompany?.foodHandlingPlaces">
      <select [(ngModel)]="selectedPlace" (change)="selectPlace()" id="place-select">
        <option *ngFor="let place of selectedCompany.foodHandlingPlaces" [ngValue]="place">
          {{ place?.name }}
        </option>
      </select>
    </li>
    

    在你的组件中

    import { Component, OnInit } from '@angular/core';
    import { DataService } from '../../services/data.service';
    import { ActivatedRoute, Router } from '@angular/router';
    
    @Component({
      selector: 'user-header',
      templateUrl: '../../templates/plan/header.html',
    })
    export class HeaderComponent implements OnInit {
    
      data;
      selectedCompany;
      selectedPlace;
    
      constructor(
        private dataService: DataService,
        private router: Router,
        private route: ActivatedRoute
      ) { }
    
      ngOnInit() {
        this.data = this.route.parent.snapshot.data;
        this.selectedCompany = this.data.companies[0];
        if (!this.dataService.selectedPlace.getValue()) {
          this.dataService.selectedPlace = this.selectedCompany.foodHandlingPlaces[0];
        }
        this.selectedPlace = this.selectedCompany.foodHandlingPlaces.filter(
          x => x.id === this.dataService.selectedPlace.getValue().id
        )[0];
        if (!this.selectedPlace) {
          this.selectedPlace = this.selectedCompany.foodHandlingPlaces[0];
        }
      }
    }
    

    【讨论】:

    • 是的,有人告诉我 Angular 和 jQuery 不应该一起使用,但我需要它,并且将它从文件中完全删除对解决手头的问题没有帮助。另外 - 不幸的是,这个解决方案不显示数据。
    • I need it 不,你没有。 JQuery 所做的一切,Angular 也一样。你现在有什么问题?
    • 猜我只是习惯了 jQuery。不过,我会考虑摆脱它。问题仍然存在 - 数据未显示。现在它也不显示选择框,因为 *ngIf。
    • 好吧,您没有以正确的方式获取数据。记录您尝试分配的每个变量并查看它是否有数据。
    • 过滤器功能也有问题。我发现的解决方法是克隆数组,例如:this.selectedPlace = JSON.parse(JSON.stringify(array.filter()))。由于某种原因,过滤器在某些情况下会在读取下一行后完成。
    猜你喜欢
    • 2019-11-26
    • 2014-08-23
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2022-01-20
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多