Considere o seguinte componente:
@Component({
selector: 'app-test'
template: 'Hello!'
}}
export class TestComponent {
@Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}
Com a ligação:
<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>
Observe que eu escrevi em selectedChange
vez do nome de saída correto selectionChange
. O Angular 9 com a bandeira strictTemplates
ativada não me ajudou em nada. Falha silenciosamente. A parte interessante é que, se eu fizer o mesmo @Input
, o aplicativo detectará o (s) erro (s) e não será compilado.
Existe alguma maneira de gerar um erro se eu tentar "ouvir" um inexistente @Output
?
angular
angular-directive
angular9
dev_054
fonte
fonte
@Output()
lib compartilhada ou até mesmo no aplicativo e esquece de remover as chamadas ... e como não temos erros de compilação, como temos@Input()
, não conseguimos encontrar exatamente o que causa certos problemas (ou mesmo por não guardar lixo no código). Testes de unidade podem ser úteis? Talvez, mas no momento ainda não é possível devido ao tempo.Respostas:
Não há erro lançado porque a ligação de evento em angular é usado não só com
@Output
s eEventEmitter
s, mas também para ouvir os eventos DOM , comoclick
,keyup
, etc. Pode até ser usado para ouvir eventos personalizados . Por exemplo, se você criar e emitir um evento personalizado no componente filho:Em seguida, no componente pai, você pode identificá-lo pelo nome:
Angular usa target.addEventListener (tipo, ouvinte [, opções]); internamente (você pode verificar isso nos links abaixo), onde
type
pode haver qualquer string.É por isso que não lança nenhuma exceção se não encontrar
@Output
s correspondentes .listenToElementOutputs
DefaultDomRenderer2.listen
EventManager.addEventListener
DomEventsPlugin.addEventListener
fonte
@Input()
(lembre-se que as entradas têm as mesmas características: pode ser algo global comodisabled
,id
, etc.) angular jogou erros? Por que funciona para@Input
, mas não para@Output
? Além disso, estou tentando encontrar uma maneira de avisar / lançar erro se um inexistente@Output
for passado.addEventListener
(adicionarei alguns links à minha resposta para mostrá-la). Eu acho que foi feito intencionalmente, para que os desenvolvedores pudessem usar a associação de eventos com seus próprios eventos personalizados. Acredito que não há como desativar esse comportamento no momento da compilação. Embora alguns IDEs (como o IntelliJ Idea) possam destacar esses locais e exibir avisos.[attr.any-attribute]
, neste caso, nenhum erro será gerado.Não há solução direta para o seu problema, no entanto, alguns casos podem ser abordados.
click
evento de botão , poderá fazer parte do seletor, por exemploselector: 'app-test[selectionChange]'
. Além disso, você pode fazer isso por exemplo:selector: 'app-test[selectionChange]', app-test[click]'
significadoclick
ouselectionChange
é necessário.selectionChange
paraselectedChange
isso, poderá usar este seletor:selector: 'app-test:not([selectionChange])'
para forçar os usuários a atualizar.fonte
Se você estiver usando o Código VS, poderá instalar esta extensão: O Angular Language Service emitirá um aviso quando um método ou propriedade não estiver definido. Esta extensão funciona com saídas e entradas (e attrs, etc ...).
fonte
@Output
, o Angular Language Service não ajuda em nada. Deixe-me saber se você precisa que eu esclareça a pergunta.@Output
você verá a mesma mensagem de erro.