Angular @Output无效

时间:2017-07-09 18:31:32

标签: javascript angular angular-components

尝试使用@Output事件发射器进行子级与父级通信,但无法正常工作 这是子组件

import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core';

@Component({
  selector: 'app-emiter',
  templateUrl: './emiter.component.html',
  styleUrls: ['./emiter.component.css']
})
export class EmiterComponent implements OnInit {

@Output() emitor: EventEmitter<any>
  constructor() { this.emitor = new EventEmitter()}

   touchHere(){this.emitor.emit('Should Work');
   console.log('<><><><>',this.emitor) // this comes empty
  }

  ngOnInit() {
  }

}

这是html模板

<p>
<button (click)=" touchHere()" class="btn btn-success btn-block">touch</button>
</p>

touch.e里面的console.log它没有显示任何内容 即使我把它放在父组件中它也没有显示任何内容 父组件

 import { Component , OnInit} from '@angular/core';
// service I use for other stuff//
    import { SenderService } from './sender.service';
// I dont know if I have to import this but did it just in case
    import { EmiterComponent } from './emiter/emiter.component'

@Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent {
      title = 'app';
      user: any;
      touchThis(message: string) {
        console.log('Not working: ${message}');
      }
        constructor(private mySessionService: SenderService) { }
    }

这是html模板

<div>
  <app-emiter>(touchHere)='touchThis($event)'</app-emiter>
</div>

4 个答案:

答案 0 :(得分:4)

父组件模板:

  <app-emitor (emitor)='touchThis($event)'></app-emiter>

在父模板中@Output应该被称为&#39;而不是子方法。

另请参阅:https://angular.io/guide/component-interaction#parent-listens-for-child-event

答案 1 :(得分:1)

以下是我们如何编写具有输出的组件的示例:

@Component({
  selector: 'single-component',
  template: `<button (click)="liked()">Like it?</button>`
 })
 class SingleComponent {
 @Output() putRingOnIt: EventEmitter<string>;

 constructor() {
 this.putRingOnIt = new EventEmitter();
 }

 liked(): void {
 this.putRingOnIt.emit("oh oh oh");
 }
}

请注意,我们完成了所有三个步骤:1。指定输出,2。创建了我们附加的EventEmitter 输出属性putRingOnIt和3.调用喜欢时发出一个事件。

如果我们想在父组件中使用此输出,我们可以这样做:

@Component({
  selector: 'club',
  template: `
    <div>
      <single-component
        (putRingOnIt)="ringWasPlaced($event)"
        ></single-component>
    </div>`
})
class ClubComponent {
ringWasPlaced(message: string) { console.log(`Put your hands up: ${message}`);
} }
// logged -> "Put your hands up: oh oh oh"

再次注意:

  • putRingOnIt来自SingleComponent的输出
  • ringWasPlaced是ClubComponent
  • 上的一项功能
  • $ event包含wasemitted,在本例中为字符串

答案 2 :(得分:0)

 <app-emiter (emitor)="touchThis($event)" ></app-emiter>

通过使用@Output(),你应该在发射器组件的指令中应用你需要发出的事件。将变量的名称添加到指令中,但是在引号内发出的over函数传递{{ 1}}。

答案 3 :(得分:0)

touchHere()是绑定事件发射器要发射的某些值的方法。而您的EventEmitter是“模仿者”。

因此,只需执行以下操作,代码就可以工作:

<app-emiter (emitor)='touchThis($event)'></app-emiter>