【问题标题】:How to get JSON data into Dialog Component如何将 JSON 数据获取到对话框组件中
【发布时间】:2019-09-07 11:11:47
【问题描述】:

在此之前,将鼠标悬停在信息图标上时会显示 JSON 数据。现在我希望在单击信息图标时将 JSON 数据传递到对话框中。但我不知道怎么做。

HTML

<h2 mat-dialog-title>Info</h2>

<mat-dialog-actions>
  <button mat-button (click)="matDialogRef.close()">Ok</button>
</mat-dialog-actions>

Dialog-Component.ts


import { Component, OnInit, Input, Inject, ViewEncapsulation, HostListener } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef} from '@angular/material';
import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms';
import { PlannerProject } from 'app/services/planner-projects/planner-project';

@Component({
  selector: 'app-my-dialog',
  templateUrl: './my-dialog.component.html',
  styleUrls: ['./my-dialog.component.scss']
})
export class MyDialogComponent implements OnInit {

  @Input() project: PlannerProject;

  projectData: string;

  constructor(public matDialogRef: MatDialogRef<MyDialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: any) { }

  ngOnInit() {
  }

  ngOnChanges(event): void {

  if (event.project !== undefined) {
    this.projectData = JSON.stringify(this.project, null, 2);
  }
}
  ok(): void {
    this.matDialogRef.close();
  }

}

Delivery-Order.Component.ts

import { DeliveryOrderEditComponent } from './../delivery-order-edit/delivery-order-edit.component';
import { SelectionModel } from '@angular/cdk/collections';
import { Component, OnInit, ViewChild, OnDestroy, ElementRef, Input, OnChanges } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { PlannerProjectsService } from 'app/services/planner-projects/planner-projects.service';
import { map, switchMap, tap, debounceTime, distinctUntilChanged } from 'rxjs/operators';
import { DeliveryOrdersService } from '../delivery-orders.service';
import { Observable, of, Subscription, fromEvent } from 'rxjs';
import * as moment from 'moment';
import { MatPaginator, MatSort, PageEvent, MatTableDataSource, MatDialog } from '@angular/material';
import * as _ from 'lodash';
import { FuseSidebarService } from '@fuse/components/sidebar/sidebar.service';
import { DeliveryOrder } from '../delivery-order';
import { MyDialogComponent } from './../my-dialog/my-dialog.component';
import { PlannerProject } from 'app/services/planner-projects/planner-project';
import { FuseConfirmDialogComponent } from '@fuse/components/confirm-dialog/confirm-dialog.component';
import { UploadExcelService } from 'app/services/upload-excel.service';

@Component({
  selector: 'app-delivery-orders',
  templateUrl: './delivery-orders.component.html',
  styleUrls: ['./delivery-orders.component.scss']
})
export class DeliveryOrdersComponent implements OnInit, OnDestroy, OnChanges {
  @Input() project: PlannerProject;

  @ViewChild(MatPaginator) paginator: MatPaginator;
  @ViewChild(MatSort) sort: MatSort;

  selection: SelectionModel<DeliveryOrder>;

  importId: string;
  dataTable;
  sub: Subscription;
 projectData : string;

  // _filter: string;
  _sortBy: string;
  _sortOrder = 'asc';
  _pageSize = 10;
  _pageIndex = 1;

  _options = {
    pageSize: 100,
    pageSizeOptions: [100, 150, 200, 250]
  };

  _displayedColumns = [
    { displayName: 'Location Name', column: 'locationName', sort: true },
    { displayName: 'Delivery Address', column: 'address', sort: false },
    { displayName: 'Is Valid', column: 'isValid', sort: false },
    { displayName: 'Import At', column: 'importedAt', sort: false },
    { displayName: 'File Name', column: 'importFileName', sort: false },
    // { displayName: '', column: '' },
    // { displayName: '', column: '' },
  ];

  _displayColumns: string[] = ['selectRow', 'locationName', 'address', 'quantity', 'weight', 'volume', 'remarks', 'importedAt', 'actions'];

  _actions = [
    {
      text: 'Edit',
      action: (row) => {
        console.log(`row`, row);
      }
    }
  ];

  _dataSource: MatTableDataSource<DeliveryOrder>; // = new DeliveryOrdersDataSource(this.deliveryOrderService, '');
  _filter: string | Observable<string>;

  // @ViewChild('listHeader') listHeader: PageListTemplateComponent;
  @ViewChild('search') search: ElementRef;

  constructor(private route: ActivatedRoute,
              private router: Router,
              private projectService: PlannerProjectsService,
              private deliveryOrderService: DeliveryOrdersService,
              private uploadExcelService: UploadExcelService,
              private _matDialog: MatDialog) { }

              openDialog(): void {
                const Ref = this._matDialog.open(MyDialogComponent, {  
                });

                Ref.afterClosed().subscribe(result => {
                  console.log('The dialog was closed');
                  console.log(result);
                });
              }

  ngOnInit(): void {
    this.initDataTable();
  }

  ngOnDestroy(): void {
    console.log(`destroy`);
    if (this.sub) {
      this.sub.unsubscribe();
    }
  }

  ngOnChanges(): void {
    if (this.project !== undefined) {
      this.projectData = JSON.stringify(this.project, null, 2);
      this.loadList(this.project.importId).toPromise().then((data) => {
        console.log(`data`, data);
        _.map(data, this.formatData.bind(this));
        this.dataTable = data;
        this._dataSource.data = this.dataTable;
        this.selection = new SelectionModel<DeliveryOrder>(true, []);
      });
    }

所以当我点击信息图标时,它会在对话框中显示 JSON 数据。我还添加了 Delivery-order.component。我对 JSON 了解不多,所以我在尝试解决这个问题以使 JSON 值显示方面非常薄弱

【问题讨论】:

  • 你如何打开这个dialog,因为我看到你声明了Input(),但如果它不是来自父母,它不会显示任何东西。请为this.project 制作一个console.log 并告诉我它返回了什么?
  • 您的问题不清楚。什么是服务回报?
  • 我已经添加了我的 delivery-component.ts,这有帮助吗?我真的不明白

标签: html json angular dialog


【解决方案1】:

当您在交付组件中创建对话框时,您可以通过以下方式为您的对话框组件定义输入数据:

const Ref = this._matDialog.open(MyDialogComponent, {  
            data: { id: 'id-value' }
        });

然后您可以在对话框组件中恢复数据:

constructor(public matDialogRef: MatDialogRef<MyDialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: any) { 
    console.log(this.data.id);
}

在这个例子中,this.data 将包含从你的主组件传递到对话框的数据,id 字段只是一个示例,你可以将任何你想要的传递给对话框组件。

【讨论】:

  • 嗯,那么我应该在数据区域中添加什么以使 JSON 工作?
  • 我需要额外的信息来回答你,你想从交付组件传递什么样的数据到对话组件,你能给我一个你想传递什么数据的例子吗?如果需要,您还可以将包含 json 的变量传递给数据。
  • @Simo 你的回答是正确的,但正如你所说,它有一些他正在寻找的信息。我用同样的方法传数据,到现在都没问题。
  • 你说得对,我的实现是基本的,但它是故意完成的,我更喜欢给他一个带有通用数据的例子,只是为了清楚哪些数据在两个组件之间传递,并保持“你也可以传递一个变量”作为代码外的注释。无论如何,很高兴指出这种情况,如果 OP 需要更具体的答案,我会正确更新我的。
  • 谢谢大家,我需要在对话框组件的 HTML 部分添加一些内容。我的导师教我,它现在展示了
【解决方案2】:

试试这样的。

第一种方法将打开对话框并传递项目的所有数据

 openDialog(): void {
   const Ref = this._matDialog.open(MyDialogComponent, { data: this.project });

并且在对话框中就像@Simo所说的那样使用
这会将传递的数据从组件注入到对话框

constructor(public matDialogRef: MatDialogRef<MyDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: any) { 
console.log(this.data);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多