将布尔值传递给另一个Angular组件

4

我有两个Angular组件

results.table和results.query

当用户点击results.query.component中的重置按钮时,我想隐藏results.table.component内的表格。

也许我在使用事件发射器时做错了,或者还有更好的方法来解决这个问题。

results.table HTML

<div *ngIf='results?.length>0'>
  <table *ngIf="showResults" class='table'>
    <tr>
      <th>Result Name</th>
      <th>Location</th>
    </tr>
    <tbody>
    <ng-template ngFor let-results [ngForOf]='items' let-i="index">
      <tr>
        <td>
          <span>{{result?.description}}</span>
        </td>
        <td>
          <span>{{result?.location}}</span>
        </td>
      </tr>
    </ng-template>
    </tbody>
  </table>
</div>

结果表 TS

showResults: boolean = true;

showResults(event) {
    console.log('this is not getting called')
    if (event) {
      this.showResults = false;
    }
}

结果查询HTML

<div class="panel-body">
      <form (submit)="onSubmitClicked()">
        <div class="row">
          <div class="form-group col-md-12 col-xs-12">

            <div class="col-xs-12 col-sm-3 col-md-3 col-lg-3">
              <label class="col-md-12 col-xs-12 control-label  no-margin no-padding">Location: </label>
              <pg-radio-toggle-select class="col-md-12 col-xs-12 no-margin no-padding" name="locationChangeInput" [(ngModel)]="Location"
                (selectedChanged)="onFilteringLocation($event)" [options]='locationOptions'>
              </pg-radio-toggle-select>
            </div>

            <pg-inputfield name="description" class="col-xs-12 col-sm-3 col-md-3 col-lg-3" [(ngModel)]="paramsModel.description"
                           displaytext="Name:"></pg-inputfield>
          </div>
        </div>

        <div>
          <button type="reset" class="btnReset" (click)="reset()">Reset</button>
          <button type="submit" name="btnSearch">Search</button>
        </div>
      </form>
    </div>

查询结果 TS

import {Component, OnInit, EventEmitter, Output} from '@angular/core';
import * as _ from 'lodash';
import { LocationService } from '../location-service.service';

@Component({
  selector: 'result-query',
  templateUrl: './result-query.component.html',
  styleUrls: ['./result-query.component.less'],
})
export class ResultQueryComponent implements OnInit {
  @Output() showResults:  EventEmitter<boolean> = new EventEmitter<boolean>();

  constructor(
      private LocationService: LocationService,
  ) {
    this.reset();
  }

  ngOnInit() {
    this.reset();
  }

  onSubmitClicked() {
    console.log('test')
  }

  reset(): void {
    console.log('I am the reset king');
    this.showResults = false;
    this.showResults.emit(true);
    this.onSubmitClicked();
  }
}

请问您能否发布 results.table 组件的完整 HTML 代码?我们想知道 results.table 组件的 HTML 代码和 results.query 之间的关系,也就是这两个组件是如何渲染的,是父子关系还是其他关系。根据您提供的代码,我们将能够给出答案。 - user2216584
@user2216584,我已经添加了完整的results.table。感谢你的帮助。 - themanwiththemasterplan
results.table的HTML代码没问题。我想请求您展示一下与results.table HTML和results.query HTML相关的代码,也就是将这两个HTML放在一起的模板。从您的results.query TS中可以看出,您的HTML之间存在父子关系。给我们展示这两个HTML放在一起的代码将使我们更好地了解情况并为您提供更好的解决方案。 - user2216584
@user2216584 现在已经更新了!再次感谢。 - themanwiththemasterplan
很抱歉,但您仍未分享模板,该模板显示了您的results.table和results.query组件之间的关系。让我再试一次 - 您从ResultQueryComponent中有一个<result-query>选择器,同样,您也会从ResultTableComponent中有一个选择器。这两个选择器在您的页面中是如何呈现的?是像这样的东西 - <result-table><result-query></result-query></result-table>吗?通过查看您分享的代码,真的很难知道这两个组件是如何相关/呈现的。 - user2216584
2个回答

2
如果两个组件具有父子关系,您可以使用@Input() @Output()装饰器。 在Angular组件之间共享数据的4种方式 组件交互 输入输出示例 父组件
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Stephen } from '../stephen.model';

@Component({
    selector: 'app-parent',
    template: `

        Hello, Mr. (or Ms.): {{ selectedName }}

`,
styleUrls: ['./parent.component.css'],
    encapsulation: ViewEncapsulation.None
})

export class ParentComponent implements OnInit {
    stephen: Stephen;
    selectedName: string;

    constructor() {
        this.stephen = new Stephen();
        this.selectedName = this.stephen.firstName;
    }

    ngOnInit() {
    }

    updateName(selectedName: string): void {
    console.log('in parent');
    this.selectedName = selectedName;
    }

}

Child Component

import { Component, OnInit, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core';
import { Stephen } from '../../stephen.model';
@Component({
    selector: 'app-child',
    template: `
        {{ stephen.firstName }}
        {{ stephen.lastName }}
        {{ stephen.fullName }}
        `,
    styleUrls: ['./child.component.css'],
    encapsulation: ViewEncapsulation.None
})
export class ChildComponent implements OnInit {
    @Input() stephen: Stephen;
    @Output() onNameSelected: EventEmitter;
    constructor() {
        this.onNameSelected = new EventEmitter();
    }
    ngOnInit() {
    }
    clicked(name: string): void {
        this.onNameSelected.emit(name);
    }
}

重要 - 第二种解决方案
但在您的情况下,这两个组件似乎没有父子关系。如果您想在两个组件之间共享数据,可以创建一个可共享的服务。该服务将包含一个 EventEmitter,需要最新更改的组件将在 ngOnInit 方法中订阅该事件,并且具有最新数据的组件将调用来自此可共享服务的函数以发出该事件。
可共享服务
import { Injectable, Output, EventEmitter } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class MessengerService {

  @Output() change: EventEmitter<any> = new EventEmitter();

  sendData(data: any): any {
    this.change.emit(data);
  }

}

想要了解这个变化的组件将在它的 ngOnInit 中订阅此事件,如下所示。
messengerService.change.subscribe(emitedValue => {
   this.value = emitedValue;
});

具有新更改的组件将调用sendData方法,这是消息/可共享服务,以便在需要时向事件订阅者发布新数据。

0
我不知道你是否忘记在问题中写下它,但你的results.Table HTML应该有一个results.query标签,并通过它调用输出。考虑到你的选择器是app-results-query,代码应该像这样:

results.table HTML

<app-results-query (showResults)="changeShowResults($event)"></app-results-query>
<table *ngIf="showResults">
    //table stuff
</table>

结果.表格 TS

showResults: boolean = true;

changeShowResults(event: boolean) {
    console.log('this is not getting called')
    if (event) {
      this.showResults = false;
    }
}

我已经将结果绑定到HTML,我已经更新了描述中的代码。 - themanwiththemasterplan
据我所见,您的结果表组件与结果查询组件没有任何关联。如果在结果查询组件中发出showResults事件,那么结果表组件中将什么也不会改变。要实现您在这里想要实现的功能,结果查询组件必须是结果表组件的子级,就像我上面输入的示例代码一样。 - mvoelcker
这里有一个很好的简单示例,可以了解输出事件的使用:https://dzone.com/articles/understanding-output-and-eventemitter-in-angular - mvoelcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接