- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我有一个问题,在订阅检索特定站点所有详细信息的服务后,我的 mat-table 没有更新。我有一个由父组件(DepotSelectionComponent)和两个子组件InteractiveMapComponent、MapResultComponent组成的结构。我正在从 InteractiveMapComponent 检索单击事件,该事件向上冒泡到父级(DepotSelectionComponent),然后父级(DepotSelectionComponent)调用服务,然后更新 MapResultComponent 中的数据源。
当前行为:
表格不会在单击时更新,只有当我单击 InteractiveMapComponent 中的后退按钮时才会更新,这对我来说毫无意义。
预期行为:
点击后表格更新,表格立即更新。
父级(DepotSelectionComponent)TS:
import { Component, OnInit, ViewChild, NgZone } from '@angular/core';
import { MapResultComponent } from '../map-result/map-result.component';
import { InteractiveMapComponent } from '../interactive-map/interactive-map.component';
import { SiteService } from '../shared/services/site-service';
import { siteDetails } from '../shared/interfaces/site-details.interface';
import { MatTableDataSource } from '@angular/material';
@Component({
selector: 'app-depot-selection',
templateUrl: './depot-selection.component.html',
styleUrls: ['./depot-selection.component.scss']
})
export class DepotSelectionComponent implements OnInit {
page:string;
countyName: string;
@ViewChild(MapResultComponent, {static: false})
private MapResultComponent: MapResultComponent;
constructor(private zone: NgZone,
private _siteService: SiteService) { }
ngOnInit() {
this.page = "siteLandingPage";
}
home() {
this.page = "siteLandingPage";
}
getDetailsPage() {
this.page = "siteMoreDetails";
}
depotMoreDetails() {
this.page = "depotMoreDetails"
}
populateResults(countyName) {
this.MapResultComponent.mapResultHeader = countyName.dataObj.label;
this.MapResultComponent.siteResults.length = 0;
this._siteService.getSites(countyName.dataObj.label)
.subscribe((data: any[]) => {
data.forEach(e => {
this.MapResultComponent.siteResults.push(new siteDetails(e.Site_ID, e.Address1, e.Address2, e.Town, e.County, e.PostCode, e.Name, e.Description, e.TelephoneNumber));
})
});
this.MapResultComponent.dataSource = new MatTableDataSource(this.MapResultComponent.siteResults);
console.log(this.MapResultComponent.dataSource)
}
}
父级(DepotSelectionComponent)html:
<div class="main">
<div [ngSwitch]="page">
<div *ngSwitchCase="'siteLandingPage'">
<div class="interactiveMap">
<app-interactive-map (siteDetailTable)="populateResults($event)"></app-interactive-map>
</div>
<div class="mapResult">
<app-map-result (moreDetails)="getDetailsPage($event)"></app-map-result>
</div>
</div>
<div *ngSwitchCase="'siteMoreDetails'">
<div>
<button mat-raised-button (click)="home()">Back</button>
</div>
<div class="clearFloat"></div>
<app-site-details (depotMoreDetails)="depotMoreDetails($event)"></app-site-details>
</div>
<div *ngSwitchCase="'depotMoreDetails'">
<div>
<button mat-raised-button (click)="getDetailsPage()">Back</button>
</div>
<div class="clearFloat"></div>
<app-depot-parent></app-depot-parent>
</div>
</div>
</div>
子(InteractiveMapComponent)TS:
import { Component, OnInit, NgZone, EventEmitter, Output, ChangeDetectorRef } from '@angular/core';
import { FusionCharts } from 'fusioncharts';
import { InteractiveMapService } from './interactive-map.service';
import { Observable } from 'rxjs/Rx';
import { CountyDetails } from './county-details.interface';
@Component({
selector: 'app-interactive-map',
templateUrl: './interactive-map.component.html',
styleUrls: ['./interactive-map.component.scss']
})
export class InteractiveMapComponent implements OnInit {
dataSource: Object;
map: string;
mapType:string;
FusionCharts: FusionCharts;
test: Array<{id: string, value: string, color: string}> = [];
@Output() siteDetailTable = new EventEmitter();
constructor(private _interactiveMapService: InteractiveMapService,
private zone: NgZone) { }
ngOnInit() {
this.getUKMapData();
this.mapType = "Site Locations";
this.dataSource = {
chart: {
includevalueinlabels: "1",
labelsepchar: ": ",
entityFillHoverColor: "#EE204D",
theme: "fint",
},
// Source data as JSON --> id represents counties of england.
data : this.test,
};
}
ukMap() {
this.mapType = "Site Locations";
this.getUKMapData();
}
selectMap(map) {
switch(map) {
case "England":
this.getEnglandMapData();
this.mapType="England";
break;
case "Wales":
this.getWalesMapData();
this.mapType="Wales";
break;
case "Scotland":
this.getScotlandMapData();
this.mapType="Scotland";
break;
case "North Ireland":
this.mapType="Northern Ireland";
break;
default:
;
}
}
getGBMapData() {
this.test.length = 0;
this._interactiveMapService.getGBMapData()
.subscribe((data: any[]) => {
data.forEach(e => {
this.test.push(new CountyDetails(e.Map_Data_ID.toString(), e.County, e.Color))
})
})
}
getUKMapData() {
this.test.length = 0;
this._interactiveMapService.getUKMapData()
.subscribe((data: any[]) => {
data.forEach(e => {
this.test.push(new CountyDetails(e.Map_Data_ID.toString(), e.Country, e.Color));
})
});
}
getScotlandMapData() {
this.test.length = 0;
this._interactiveMapService.getScotlandMapData()
.subscribe((data: any[]) => {
data.forEach(e => {
this.test.push(new CountyDetails(e.Map_Data_ID.toString(), e.County, e.Color));
})
})
}
getWalesMapData() {
this.test.length = 0;
this._interactiveMapService.getWalesMapData()
.subscribe((data: any[]) => {
data.forEach(e => {
this.test.push(new CountyDetails(e.Map_Data_ID.toString(), e.County, e.Color));
})
})
}
getEnglandMapData() {
this.test.length = 0;
this._interactiveMapService.getEnglandMapData()
.subscribe((data: any[]) => {
data.forEach(e => {
this.test.push(new CountyDetails(e.Map_Data_ID.toString(), e.County, e.Color));
})
})
}
populateResultsTable(event: string) {
this.siteDetailTable.emit(event);
}
update($event) {
// Run inside angular context
this.zone.run(() => {
this.selectMap($event.dataObj.label);
})
}
}
子(InteractiveMapComponent)html:
<div class="mapContainer">
<div class="interactiveMapHeader">
<span>{{mapType}}</span>
<div *ngIf="mapType != 'Site Locations'">
<button mat-raised-button (click)="ukMap()">Back</button>
</div>
</div>
<div [ngSwitch]="mapType">
<div *ngSwitchCase="'Scotland'">
<fusioncharts
width = "500"
height = "900"
type="maps/scotland"
[dataSource]="dataSource"
(entityClick)="populateResultsTable($event)"
>
</fusioncharts>
</div>
<div *ngSwitchCase="'Wales'">
<fusioncharts
width = "500"
height = "900"
type="maps/wales"
[dataSource]="dataSource"
(entityClick)="populateResultsTable($event)"
>
</fusioncharts>
</div>
<div *ngSwitchCase="'England'">
<fusioncharts
width = "500"
height = "900"
type="maps/england"
[dataSource]="dataSource"
(entityClick)="populateResultsTable($event)"
>
</fusioncharts>
</div>
<div *ngSwitchCase="'Northern Ireland'">
<fusioncharts
width = "500"
height = "900"
type="maps/northernireland"
[dataSource]="dataSource"
(entityClick)="populateResultsTable($event)"
>
</fusioncharts>
</div>
<div *ngSwitchDefault>
<fusioncharts
width = "500"
height = "1000"
type="maps/uk7"
[dataSource]="dataSource"
(entityClick)="update($event)"
>
</fusioncharts>
</div>
</div>
</div>
子(MapResultComponent)TS:
import { Component, OnInit, ViewChild, Output, EventEmitter, ChangeDetectorRef, Input, NgZone } from '@angular/core';
import { MatTableDataSource, MatPaginator, MatDialogConfig, MatDialog } from '@angular/material';
import { NewSiteDialogComponent } from '../new-site-dialog/new-site-dialog.component';
import { siteDetails } from '../shared/interfaces/site-details.interface';
import { SiteService } from '../shared/services/site-service';
@Component({
selector: 'app-map-result',
templateUrl: './map-result.component.html',
styleUrls: ['./map-result.component.scss']
})
export class MapResultComponent implements OnInit {
displayedColumns: string[] = ['name', 'address1', 'moreDetails'];
number: number;
mapResultHeader: string;
result : string;
mapResults: Array<{name: string, address: string}> = [];
dataSource : MatTableDataSource<any>;
siteResults: Array<{Site_ID: number, Address1: string, Address2: string, Town: string, County: string, PostCode: string, Name: string, Description: string, TelephoneNumber: string}> = [];
@Output() moreDetails = new EventEmitter();
@ViewChild(MatPaginator, {static: true}) paginator: MatPaginator;
constructor(public dialog: MatDialog,
private _siteService: SiteService) {
}
loadMoreDetailsComp(changed: string) {
this.moreDetails.emit(changed);
}
ngOnInit() {
this.dataSource = new MatTableDataSource();
this.mapResultHeader = "Kent";
}
/**
* Set the paginator and sort after the view init since this component will
* be able to query its view for the initialized paginator and sort.
*/
ngAfterViewInit() {
this.dataSource.paginator = this.paginator;
}
applyFilter(filterValue: string) {
this.dataSource.filter = filterValue.trim().toLowerCase();
}
openNewSiteDialog(){
const dialogConfig = new MatDialogConfig();
dialogConfig.autoFocus = true;
dialogConfig.disableClose = true;
this.dialog.open(NewSiteDialogComponent, dialogConfig);
}
}
export interface Data {
name: string;
town: string;
address: string;
telephone: string;
}
子(MapResultComponent)html:
<div class="resultsContainer">
<div class="mapResultHeader">
<span>{{mapResultHeader}}</span>
</div>
<div class="mat-elevation-z8">
<mat-form-field class="filter">
<input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
</mat-form-field>
<table mat-table [dataSource]="dataSource">
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Site Name </th>
<td mat-cell *matCellDef="let element"> {{element.Name}}</td>
</ng-container>
<ng-container matColumnDef="address1">
<th mat-header-cell *matHeaderCellDef> Address </th>
<td mat-cell *matCellDef="let element"> {{element.Address1}}</td>
</ng-container>
<ng-container matColumnDef="moreDetails">
<th mat-header-cell *matHeaderCellDef> More Details </th>
<td mat-cell *matCellDef="let element">
<button mat-raised-button (click)="loadMoreDetailsComp($event)">More Details</button>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<mat-paginator [pageSize]="[5]" showFirstLastButtons></mat-paginator>
</div>
<div class="addNewSite">
<button mat-raised-button (click)="openNewSiteDialog()">Add New Site</button>
</div>
</div>
我完全被这个问题难住了,我假设它与异步行为有关,但我无法弄清楚
最佳答案
看起来数据源是在订阅 block 之外设置的,这导致它在数据加载之前就被设置了。您应该能够将该行移动到订阅 block 中,如下所示:
populateResults(countyName) {
this.MapResultComponent.mapResultHeader = countyName.dataObj.label;
this.MapResultComponent.siteResults.length = 0;
this._siteService.getSites(countyName.dataObj.label)
.subscribe((data: any[]) => {
data.forEach(e => {
this.MapResultComponent.siteResults.push(new siteDetails(e.Site_ID, e.Address1, e.Address2, e.Town, e.County, e.PostCode, e.Name, e.Description, e.TelephoneNumber));
});
this.MapResultComponent.dataSource = new MatTableDataSource(this.MapResultComponent.siteResults);
});
}
如果您收到“更改检测后 x 值已更改”错误,您可能还需要随后调用 changeDetectorRef.detectChanges()
,因为这看起来确实像是一系列更新。
关于javascript - Angular 垫表点击后不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59531647/
我正在尝试在项目中学习和添加 Angular 国际化。我只能理解 Angular 文档 (https://angular.io/guide/i18n-overview) 的编译时翻译。 我需要这样的东
在我的 Angular 应用程序中,基于登录用户,我想通过显示/隐藏不同的菜单项或允许/禁止某些路由来授予或限制功能。 目前成功登录后,我的 .NET Core API 会返回一个 JWT token
我是 Angular 的新手,目前我已经看过 angular.io 网站提供的一些示例。但是在component decorator在文档中的解释,它指出 Angular components are
这里是service employee-service.service.ts的代码 import { Injectable } from '@angular/core'; import { HttpC
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
如何正确安装 PUG/JADE 到 Angular 2 或更高版本 这样在工作和 AOT 和 JiT 的同时 工作单元和集成测试 并且在创建每个新组件时不会受到太多影响 最佳答案 我看到了很多解决方案
我的 Angular 12 应用程序中有一些通用组件,我计划将其创建为一个 Angular 库,以便其他应用程序也可以使用它。我们有一些应用程序在较低版本的 angular(例如 angular 8/
tl;dr; ng build 删除了包含我编译的自定义库的/dist 文件夹。这会使我项目代码中对该库的所有引用无效,从而导致 ng build 最终失败。我做错了什么? 我关注了documenta
我正在将一些“遗留”(非 typescript )js 库导入到我的 Angular SPA 中。 通常我只是从 cdn 添加一个负载到 index.html 就像: 在 Angular 分量中我只
我有这个 angular 应用程序,它基本上使用了库的概念。 我有 2 个名为 的库Lib1 和 lib2 根据他们所服务的微服务分组。 现在我将这些库导入主应用程序,即 应用1 事情一直到现在。 现
我在我的项目中启用了 angular Universal。我现在想完全删除它。我试图删除以下文件 /server.ts /webpack.server.config.js /src/tsconfig.
我已经有一个 AuthService 在登录时对用户进行身份验证,并且 AuthGuard 在未登录的情况下阻止访问。 某些页面我通过 UserProfile/Role 限制访问,但现在我需要阻止页面
我正在尝试使用 angular、TypeORM、SQLite 和其他组件作为 webpack 构建 Electron 应用程序。 我从在 GitHub 上找到的示例开始我的开发:https://git
我在从 Angular 8 更新到 9 并运行时遇到以下错误 ng 更新@angular/material: Package "@angular/flex-layout" has an incompa
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在我的 h1 元素“之前”创建一个小的程式化三 Angular 形图案,但我无法正确地圆 Angular 。右上角没问题,但其他两个有剪裁问题。 这是输出以及形状的放大图像: 使用的代码如下: h
我有一个 Angular 元素,带有自定义标记名 - fancy-button。如何将 fancy-button 嵌入 Angular 应用程序? 我已经尝试了以下方法,但都没有用 - 在 index
我已将我的项目从 angular 5.2.9 升级到 angular 6.0.0-rc.5。 除了包路径中的几个快速 RxJS 修复外,一切看起来都不错。(此链接非常有用:Want to upgrad
我是一名优秀的程序员,十分优秀!