2017-06-13 33 views
2

我主要担心的是,$event显示该行错误:

starClick($event) { 

参数$事件隐含有 '任意' 类型

我也怀疑 - 根据Angular2文档,$event所做的是捕获事件对象,因此让我问一个愚蠢的问题 - 为什么我们不称它为$object?因为它让我迷惑了不少,直到我终于意识到发生了什么这里..

import { Component } from '@angular/core'; 

@Component({ 
    moduleId: module.id, 
    selector: 'stars', 
    template: ` 
     <span class="glyphicon glyphicon-star-empty" (click)= "starClick($event)"></span> 
    ` 
}) 

export class StarsComponent { 
    starClick($event) { 
    if($event.target.className == "glyphicon glyphicon-star-empty") { 
     $event.target.className = "glyphicon glyphicon-star"; 
    } 
    else{ 
     $event.target.className = "glyphicon glyphicon-star-empty"; 
    } 
    } 
} 
+0

'$ event'在你的案例中有MouseEvent类型,你可以在你的方法中添加这个以避免警告。 – hiper2d

+1

从EventEmitter传递'$ event'。如果它是ObjectEmitter,它将是'$ object' - 但事实并非如此。 – estus

回答

9

由于tscon中的下面的标志,您会收到此错误fig.json

“noImplicitAny”:真

你有2种方法来解决这个问题。

1. "noImplicitAny": false //Make this false 

2. Mention the event type in component code, for eg. 

对于(点击)= “的onClick($事件)” 应在组件捕获为

的onClick(事件:的KeyboardEvent)

(鼠标悬停) ='onMouseOver($ event)'应该被捕获为

onMouseOver(event:MouseEvent)

3

我认为这是一个警告,而不是一个错误,你可能看到你的代码编辑器。你可以简单地通过把任何像你参数的类型避免这种情况:

starClick($event:any) { ... 

$事件是角惯例,你只应在HTML使用它像:

<input type="text" (yourCustomEvent)="onYourCustomEventHandle($event)"> 

而当你在这样的打字稿码愿意,你可以将其命名为:

onYourCustomEventHandle(apples){ ... } 

onYourCustomEventHandle(oranges){ ... } 

只是它的名字,因为我t对你更有意义。 使用自定义事件时,您使用$事件将数据传递到您的处理程序。

当与常规的事件,如使用它:

<button (click)="onClick($event)" (mouseover)='onMouseOver($event)'> 

你只是得到事件对象为在你的代码的参数,但同样,你在代码愿意,你可以将其命名为:

onClick(myClickEvent){ ... } 
onClick(e){ ... } 
onMouseOver(event){ ... } 
onMouseOver(johnny){ ... } 

但是不要忘了在HTML中总是命名$事件