Angular @Output 不起作用

Posted

技术标签:

【中文标题】Angular @Output 不起作用【英文标题】:Angular @Output not working 【发布时间】:2017-12-13 11:00:32 【问题描述】:

尝试使用@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>

touchHere里面的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>

【问题讨论】:

【参考方案1】:

父组件模板:

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

在父模板中应该“调用”@Output,而不是子方法。

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

【讨论】:

@Output 装饰器在子级中,因为子级会发出一个事件。该事件应该是 console.logged 但显示为空。在父级中,我放置了事件处理程序来接收发出的事件,但在子级中,当 console.log 时我应该看到一些东西 当然@Output 它在子组件中,你应该在父模板中调用它。在您的代码中,您改为调用子方法 (touchHere) 这是父模板 (touchHere)='touchThis($event)' 我在里面调用 touchHere父组件中的选择器。但无论如何,如果我 console.log 让孩子登录,我应该会看到一些东西,但我不是 这是一个老问题,但感谢 Vega .. 我在编写代码时遇到了错误 很高兴您找到了解决方案 :)【参考方案2】:
 <app-emiter (emitor)="touchThis($event)" ></app-emiter>

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

【讨论】:

【参考方案3】:

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

@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 包含发送的内容,在本例中为字符串

【讨论】:

【参考方案4】:

touchHere() 是您绑定某些值以使用 EventEmitter 发射的方法。而您的 EventEmitter 是“发射器”。

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

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

【讨论】:

以上是关于Angular @Output 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 angular4 的拖放事件在 IE11 中不起作用

Angular 的 $http.post 不起作用,它的 $http... 也不起作用,但 jQuerys ajax 起作用。为啥?

“动作”属性在“Angular”模板中不起作用

Angular 2 动画不起作用

Angular 5 tsconfig baseURL 不起作用

为啥 switchMap 在 Angular 拦截器(Angular 9)中不起作用