【问题标题】:如何将数据从子组件传递到父组件Angular
【发布时间】:2017-06-25 17:16:00
【问题描述】:

我有一个名为 search_detail 的组件,其中有另一个名为 calendar 的组件,

SearchDetail_component.html

 <li class="date">
   <div class="btn-group dropdown" [class.open]="DatedropdownOpened">
   <button type="button" (click)="DatedropdownOpened = !DatedropdownOpened"   class="btn btn-default dropdown-toggle" data-toggle="dropdown"
aria-haspopup="true" [attr.aria-expanded]="dropdownOpened ? 'true': 'false'">
      Date <span class="caret"></span>
  </button>
  <ul class="dropdown-menu default-dropdown">
     <calendar  ></calendar>
     <button > Cancel </button>
     <button (click)="setDate(category)"> Ok </button>
   </ul>                            
 </div>
</li>

SearchDetail_component.ts

import 'rxjs/add/observable/fromEvent';
@Component({
    selector: 'searchDetail',
    templateUrl: './search_detail.component.html',
    moduleId: module.id

})

Calendar.component.ts

import { Component, Input} from '@angular/core'; 
@Component({
    moduleId:module.id,
    selector: 'calendar',
    templateUrl: './calendar.component.html'
})

    export class CalendarComponent{
      public fromDate:Date = new Date();    
      private toDate:Date = new Date();
      private events:Array<any>;
      private tomorrow:Date;
      private afterTomorrow:Date;
      private formats:Array<string> = ['DD-MM-YYYY', 'YYYY/MM/DD', 'DD.MM.YYYY', 'shortDate'];
      private format = this.formats[0];
      private dateOptions:any = {
        formatYear: 'YY',
        startingDay: 1
      };
      private opened:boolean = false;

      public getDate():number {
        return this.fromDate.getDate()  || new Date().getTime();
      }
    }

我想通过单击搜索详细信息页面中的确定按钮来访问开始日期和结束日期。我该怎么办?

【问题讨论】:

  • 看看 angular2 bro 中的@Output()

标签: javascript angular typescript components


【解决方案1】:

将子组件中的EventEmitter注册为@Output

@Output() onDatePicked = new EventEmitter<any>();

点击时发出值:

public pickDate(date: any): void {
    this.onDatePicked.emit(date);
}

监听父组件模板中的事件:

<div>
    <calendar (onDatePicked)="doSomething($event)"></calendar>
</div>

在父组件中:

public doSomething(date: any):void {
    console.log('Picked date: ', date);
}

官方文档中也有很好的解释:Component interaction

【讨论】:

  • 只是一个示例值,演示了将值从子组件传递到父组件。你可以传递任何你想要的值(开始日期,结束日期)..
  • 我的示例中的 pickDate 应该在点击时触发,这只是一个示例。使用适合您的用例..
  • 如何创建一个对象来对这两个日期进行分组,例如:{ startDate: startDate, endDate: endDate },并立即传递它,而不是引入两个发射器?
  • 如果你想从一个路由发射到它的父级,app.component
  • @SavanGadhiya 输入事件与其他事件没有什么不同。例如,您可以绑定 (input)=".." 事件,而不是在元素上绑定 (click)=".." 事件,并将该事件进一步发送到父组件。
【解决方案2】:

为了从子组件发送数据,在子组件中创建用 output() 装饰的属性,并在父组件中侦听创建的事件。在需要时使用有效负载中的新值发出此事件。

@Output() public eventName:EventEmitter = new EventEmitter();

发出这个事件:

this.eventName.emit(payloadDataObject);

【讨论】:

  • 这里不解释如何在父组件中监听。
【解决方案3】:

大部分新版本如果出现错误替换此行

@Output() parentComponent = new EventEmitter();

几乎可以解决你的错误

【讨论】:

    【解决方案4】:

    您好,您可以使用输入和输出。 输入允许您将变量形式从父传递给子。输出相同,但从子级到父级。

    最简单的方法是将“startdate”和“endDate”作为输入传递

    <calendar [startDateInCalendar]="startDateInSearch" [endDateInCalendar]="endDateInSearch" ></calendar>
    

    通过这种方式,您可以直接在搜索页面中获得开始日期和结束日期。 让我知道它是否有效,或者以另一种方式思考。 谢谢

    【讨论】:

    • 好的...在这种情况下,我认为唯一的方法是将日历中的事件绑定到搜索。当 startdate 和 enddate 被选中时,会在搜索组件上触发此事件
    • 问题是如何将数据从子组件传递到父组件。在您的示例中,您提到了输出和输入,但仅提供了一个用于父子通信的输入示例
    猜你喜欢
    • 2020-04-05
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2019-02-27
    • 2017-04-20
    相关资源
    最近更新 更多