Ввод и вывод, как работать с ними, чтобы следовать соглашению об именах стилевого руководства Angular 2?
До того, как я узнал что-то лучшее, я имел обыкновение определять мою директиву так:
...
inputs: [
'onOutside'
]
...
export class ClickOutsideDirective {
@Output() onOutside: EventEmitter<any> = new EventEmitter();
}
Но потом я прочитал руководство по стилю и сказал, что вы не должны ставить префиксы в свои выходные данные on
так как Angular 2 поддерживает on-
синтаксис в шаблонах.
Поэтому я пытаюсь изменить это на что-то вроде:
@Input() outsideClick: any;
@Output() outsideClick: EventEmitter<any> = new EventEmitter();
Тем не менее, мне трудно отделить @Input
имя из Output
имя, если вы не можете использовать on
префикс.
Прежде чем вы могли бы назвать оба @Input
а также @Output
то же самое, но если объявить оба в экспортированном классе, это больше не работает, так как будет выдано сообщение об ошибке.
Если я назову @Input
в outside
и @Output
в outsideClick
, это на самом деле не имеет смысла, так как оба они одно и то же. outside
это функция, которую я хочу выполнить при вызове outsideClick
,
Также, outsideClick
не будет знать, что делать, если outside
больше не называю одно и то же, или я что-то упустил?
Как я должен подходить к названию @Input
а также @Output
переменные здесь, чтобы они все еще работали и имели такой же смысл, как в первом примере?
РЕДАКТИРОВАТЬ:
Пример использования:
<div clickOutside [exceptions]="['.toggler']" (outside)="doSomethingOnOutsideClick()"></div>
2 ответа
Определенно не используйте on
, В JavaScript события также не начинаются с on
, Только обработчики событий. Здесь нет onClick
событие в JS. Название события click
и если вы назначите функцию onClick
эта функция будет вызвана, когда click
Событие получено.
Если у вас есть входы и выходы, которые принадлежат друг другу, назовите их
@Input() name:any;
@Output() nameChange: EventEmitter<any> = new EventEmitter();;
Это позволяет использовать для Angular2 "двустороннюю привязку"
[(name)]="someProp"
Если вы используете @Input()
а также @Output()
(предпочтительный способ) тогда вам не нужно inputs: []
а также outputs: []
, Это два способа сделать одно и то же, и если вы используете оба, один излишний.
Чтобы соответствовать схеме именования браузера, вы можете сделать следующее:
(nameChange)="onNameChange($event)"
иметь обработчик события onNameChange
быть вызванным, когда nameChange
событие получено.
Когда событие не является частью пары ввода / вывода, вы можете или должны опустить Change
(loggedIn)="onLoggedIn($event)
На самом деле, ОП задал несколько вопросов, но с одним и тем же контекстом (следовательно, ниже есть несколько разделов).
Использование и/или определение
Если вы хотите поддерживать «двустороннюю привязку» Angular-2 и более поздних версий, соедините ввод с выходом с суффиксом, например:
@Input() password: string;
@Output() passwordChange: EventEmitter<string> = new EventEmitter();
Это позволяет сокращать руки, например:
<app-my-component
[(password)]="myPasswordProp"
>
</app-my-component>
Выше я передаю значение по умолчанию компоненту в качестве входных данных и принимаю пользовательские изменения в качестве выходных данных, в основном синхронизируя
myPasswordProp
сMyComponent
внутреннее состояние.
Соглашение об именовании
ВAngular-2
+ используйте префикс "" только для обработчиков событий, а не для эмиттеров событий.
Обратите внимание , что префикс «» не разрешен для событий (и даже вызывает ошибку компиляции, по крайней мере, в более новых версиях Angular).
Даже вJavaScript
, именованного события нет, имя событияclick
. Единственное отличие состоит в том, что JS используетonClick
как имя атрибута, куда мы передаем обработчик события, в то время как Angular запрещает этот префикс.
Angular по крайней мере позволяет использоватьon
для обработчиков событий, например:
(passwordChange)="onPasswordChange($event)"
Где
onPasswordChange
названный обработчик события вызывается, когдаpasswordChange
событие срабатывает.
Но если событие не является частью пары вход/выход, мы должны опуститьChange
суффикс при определении вывода и используйте его как:
(loggedIn)="onLoggedIn($event)"
Более того , чтобы иметь префикс, подобный схеме именования браузера, и/или отделять события от других вещей, наша компания использовала "by
" вместо префикса, например:
(byLogin)="onLogin($event)"
(bySave)="onSave($event)"
Что намного читабельнее, потому что может быть частью человеческих предложений, например:
- «Обработчик нашего приложения ожидает входа в систему, который инициируется событиями входа в библиотеку».
Или наоборот:
- «Библиотека с помощью событий входа в систему запускает обработчик нашего приложения, который ожидает входа в систему ».
Удобочитаемость — одна из причин, по которой префиксы «on» и «by» можно использовать так, как они есть.
Аннотация класса против аннотации свойства
Просто потому, что ОП упомянул об этом:
С использованием
@Input()
и/или@Output()
аннотация с переменными-членами является предпочтительным способом.Если вы используете выше, то вам не нужно проходить
inputs: []
и/илиoutputs: []
к аннотации класса.По сути, это два подхода для достижения одной и той же цели, и если вы используете один, другой будет излишним.