【问题标题】:How to pass data from Child to Parent, if Child component dynamic component如果子组件是动态组件,如何将数据从子组件传递给父组件
【发布时间】:2017-04-04 14:04:41
【问题描述】:

http://plnkr.co/edit/AcQM5h

我创建了一个 plunker。结构:我有一个 app.ts 而不是一个buttons.component。当我单击buttons.component 时,我要将数据传递给app.ts,并从app.ts 传递给我使用数据的cats-component。 所以我基本上能够上一级父级,而不是其他文件路径。

我被卡住了,因为我无法将数据从猫组件传递到 app.ts,因为猫组件是动态生成的。

这是猫组件:

import {Component, Injector, View, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'hello-world',
  template: `
    <div>This is the Child Component Hello world</div>
    {{colordata}}

    <input value="send me now" #catsinput />
    <button (click)="getdata(catsinput.value)">Give to parent</button>

  `,
   outputs: ['passdatatoParent']
})
export default class catsComponent {
  colordata = 0;
  passdatatoParent: EventEmitter<any> = new EventEmitter();

  getdata(value){
    this.passdatatoParent.emit(value);
    console.log('get cats data', value)
  }

  constructor(private injector: Injector) {
    this.colordata = this.injector.get('colordata');


  }
}

这是父母:

import {Component, NgModule, Input, Output, EventEmitter } from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import catsComponent from './cats-component';
import dogsComponent from './dogs-component';
import DynamicComponent from './dynamic-component';
import DynamicComponent from './dynamic-component';
import {ButtonsComponent} from './buttons.component';
import {componentList} from './components-list';
import * as _ from "lodash";

@Component({
  selector: 'my-app',
  template: `
    <div>

      <buttons (passdata)="getthis($event)" ></buttons>

      <button (click)="loadDogs()">Load Dogs</button>
      <dynamic-component [componentData]="componentData" (passdatatoParent)="getChildEvent($event)"></dynamic-component>
      <!--<dynamic-component [componentData]="componentData" ></dynamic-component>-->
    </div>
  `,
})



export class AppComponent {
  componentData = null;
  components:any = componentList;
  showvalue: string;

  getthis(evt){
    console.log(this.components)
    console.log('here it is' , evt);
    this.showvalue = evt;

    this.componentData = {
      component: catsComponent,
      inputs: {
        colordata: evt
      }
    };

  }
  getChildEvent(evt){
    console.log('got this from the child', evt) // NOT ABLE TO RECIEVE DATA
  }


 constructor(){

  }


  loadDogs(){
    this.componentData = {
      component: dogsComponent,
      inputs: {
        showNum: 2
      }
    };
  }
}

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ AppComponent, catsComponent, dogsComponent, DynamicComponent, ButtonsComponent ],
  bootstrap: [ AppComponent ]
})
export class AppModule {}

【问题讨论】:

    标签: javascript angular events components


    【解决方案1】:

    1) 因为来自EventEmitter 的事件不会冒泡,所以您可以使用自定义 DOM 事件来实现它:

    cats.component.ts

    constructor(private elRef: ElementRef) {}
    
    getdata(value){
      this.elRef.nativeElement.dispatchEvent(
        new CustomEvent('passdatatoParent', { bubbles: true, detail: value }));
    }
    

    app.component.ts

    getChildEvent(evt){
      console.log('got this from the child', evt.detail);
    }
    

    Plunker Example

    2) 否则你必须在DynamicComponent 中创建@Output 事件并从动态组件订阅事件

    dynamic.component.ts

    passdatatoParent: EventEmitter<any> = new EventEmitter();
    
    subscription: any;
    ...
    if(this.subscription) {
      this.subscription.unsubscribe();
    }
    if(component.instance.passdatatoParent) {
      this.subscription = component.instance.passdatatoParent
          .subscribe(x => this.passdatatoParent.emit(x))
    }
    

    Plunker Example

    3) 另一种解决方案是将回调函数作为输入传递

    app.component.ts

    this.componentData = {
      component: catsComponent,
      inputs: {
        colordata: evt,
        passdatatoParent: (val) => {
          console.log(val);
        }
      }
    };
    

    cats.component.ts

    getdata(value){
      this.injector.get('passdatatoParent')(value);
    }
    

    Plunker Example

    【讨论】:

    • 根据您的第一个结果,我检查了什么是:ElementRef 以查看 func 并得到“允许直接访问 DOM 会使您的应用程序更容易受到 XSS 攻击。”在 Angular 网站上:angular.io/docs/js/latest/api/core/index/ElementRef-class.html 有什么想法吗?真的有风险吗?
    • 如果你不打算使用 webworker 或服务器渲染,那么我在这里看不到任何问题
    • 在第 2 个版本上,我似乎不像在第 46 行的 app.ts 中那样工作,它应该将其注销,但在日志中似乎什么也没看到
    • 我没有看到你的结果。有笨蛋吗?
    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 2020-05-27
    • 2020-11-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多