typescript Angular 2的输入和输出命名约定是否遵循样式指南?

uemypmqf  于 2023-02-05  发布在  TypeScript
关注(0)|答案(2)|浏览(128)

输入和输出,如何使用它们以遵循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>
9nvpjoqh

9nvpjoqh1#

绝对不要使用on。在JavaScript中,事件也不要以on开头。只有事件处理程序才可以。JS中没有onClick事件。事件名称为click,如果您为onClick分配一个函数,则在收到click事件时将调用此函数。
如果输入和输出属于同一类,请为其命名

@Input() name:any; 
@Output() nameChange: EventEmitter<any> = new EventEmitter();;

这允许Angular2“双向绑定”的短手

[(name)]="someProp"

如果您使用@Input()@Output()(首选方式),则不需要inputs: []outputs: []。这两种方式做相同的事情,如果您同时使用两种方式,则其中一种是多余的。
要匹配浏览器命名方案,您可以执行以下操作

(nameChange)="onNameChange($event)"

以便在接收到nameChange事件时调用事件处理程序onNameChange
如果事件不是输入/输出对的一部分,则可以或应该忽略Change

(loggedIn)="onLoggedIn($event)
goqiplq2

goqiplq22#

实际上,OP提出了多个问题,但背景相同(因此下文有多个章节)。

用法和/或定义

如果您想支持Angular-2和更高版本的“双向绑定”,那么将input与后缀为Change的输出配对,如下所示:

@Input() password: string;
@Output() passwordChange: EventEmitter<string> = new EventEmitter();

这允许速记,如:

<app-my-component
    [(password)]="myPasswordProp"
    >
</app-my-component>

上面我将默认值作为输入传递给组件,并将用户的更改作为输出,基本上将myPasswordPropMyComponent的内部状态同步。

命名约定

Angular-2+中,“on“前缀仅用于事件处理程序,从不用于事件发射器。

注意事件不允许使用“on“前缀(甚至会导致编译错误,至少在较新的Angular版本中是这样)。

即使在JavaScript中,也没有onClick命名的事件,事件名是click。唯一的区别是JS使用onClick作为我们传递事件处理程序的属性的名称,而Angular禁止使用该前缀。
Angular至少允许使用on作为事件处理程序,例如:

(passwordChange)="onPasswordChange($event)"

其中,在触发passwordChange事件时调用onPasswordChange命名的事件处理程序。
但是如果事件是输入/输出对的而不是部分,那么我们应该在定义输出时省略Change后缀,并像这样使用它:

(loggedIn)="onLoggedIn($event)"

或者更进一步,为了有一个像Browser的命名方案这样的前缀,和/或为了将事件与其他事情分开,我们公司使用了“by“前缀,例如:

(byLogin)="onLogin($event)"

(bySave)="onSave($event)"

它的可读性要强得多,因为它可以成为人类句子的一部分,比如:

  • “我们的应用程序的处理程序正在等待登录发生,这是由库的登录事件触发的。”

或者反过来说:

  • “库通过登录事件触发我们的应用程序的处理程序,该处理程序在登录时挂起。”

可读性是为什么“on”和“by”前缀都可以按原样使用的原因之一。

类注解与属性注解

就因为OP提到了:

  • 使用@Input()和/或@Output()注解以及成员变量是首选方法。
  • 如果你使用上面的方法,那么你就不需要把inputs: []和/或outputs: []传递给类的注解。
  • 基本上,这是两种实现相同目标的方法,如果您使用其中一种,另一种就是多余的。

相关问题