输入和输出,如何使用它们以遵循Angular 2的样式指南的命名约定?
在我了解更多之前,我曾经这样定义我的指令:
...
inputs: [
'onOutside'
]
...
export class ClickOutsideDirective {
@Output() onOutside: EventEmitter<any> = new EventEmitter();
}
但是后来我读了styleguide,它说你不应该用on
作为输出的前缀,因为angular 2支持模板中的on-
语法。
所以我试着把它改成:
@Input() outsideClick: any;
@Output() outsideClick: EventEmitter<any> = new EventEmitter();
但是,我发现如果不允许使用on
前缀,就很难将@Input
名称与Output
名称分开。
之前,您可以将@Input
和@Output
命名为相同的名称,但如果在导出的类中声明两者,则由于将抛出错误,因此这将不再起作用。
如果我把@Input
命名为outside
,把@Output
命名为outsideClick
,这实际上没有意义,因为它们是同一个东西。outside
是我在调用outsideClick
时要执行的函数。
此外,如果outside
不再是相同的名称,outsideClick
将不知道执行什么,或者我错过了什么?
在这里,我应该如何命名@Input
和@Output
变量,以便它仍然可以工作,并且与第一个示例中的变量一样有意义?
- 编辑:**
用法示例:
<div clickOutside [exceptions]="['.toggler']" (outside)="doSomethingOnOutsideClick()"></div>
2条答案
按热度按时间9nvpjoqh1#
绝对不要使用
on
。在JavaScript中,事件也不要以on
开头。只有事件处理程序才可以。JS中没有onClick
事件。事件名称为click
,如果您为onClick
分配一个函数,则在收到click
事件时将调用此函数。如果输入和输出属于同一类,请为其命名
这允许Angular2“双向绑定”的短手
如果您使用
@Input()
和@Output()
(首选方式),则不需要inputs: []
和outputs: []
。这两种方式做相同的事情,如果您同时使用两种方式,则其中一种是多余的。要匹配浏览器命名方案,您可以执行以下操作
以便在接收到
nameChange
事件时调用事件处理程序onNameChange
。如果事件不是输入/输出对的一部分,则可以或应该忽略
Change
goqiplq22#
实际上,OP提出了多个问题,但背景相同(因此下文有多个章节)。
用法和/或定义
如果您想支持Angular-2和更高版本的“双向绑定”,那么将input与后缀为
Change
的输出配对,如下所示:这允许速记,如:
上面我将默认值作为输入传递给组件,并将用户的更改作为输出,基本上将
myPasswordProp
与MyComponent
的内部状态同步。命名约定
在
Angular-2
+中,“on
“前缀仅用于事件处理程序,从不用于事件发射器。注意事件不允许使用“
on
“前缀(甚至会导致编译错误,至少在较新的Angular版本中是这样)。即使在
JavaScript
中,也没有onClick
命名的事件,事件名是click
。唯一的区别是JS使用onClick
作为我们传递事件处理程序的属性的名称,而Angular禁止使用该前缀。Angular至少允许使用
on
作为事件处理程序,例如:其中,在触发
passwordChange
事件时调用onPasswordChange
命名的事件处理程序。但是如果事件是输入/输出对的而不是部分,那么我们应该在定义输出时省略
Change
后缀,并像这样使用它:或者更进一步,为了有一个像Browser的命名方案这样的前缀,和/或为了将事件与其他事情分开,我们公司使用了“
by
“前缀,例如:它的可读性要强得多,因为它可以成为人类句子的一部分,比如:
或者反过来说:
可读性是为什么“on”和“by”前缀都可以按原样使用的原因之一。
类注解与属性注解
就因为OP提到了:
@Input()
和/或@Output()
注解以及成员变量是首选方法。inputs: []
和/或outputs: []
传递给类的注解。