Rozważ następujący komponent:
@Component({
selector: 'app-test'
template: 'Hello!'
}}
export class TestComponent {
@Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}
Z rozmową:
<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>
Zauważ, że napisałem selectedChange
zamiast prawidłowej nazwy wyjściowej selectionChange
. Angular 9 z strictTemplates
włączoną flagą wcale mi nie pomógł. Po cichu zawiodło. Interesujące jest to, że jeśli zrobię to samo @Input
, aplikacja złapie błąd (błędy) i się nie skompiluje.
Czy istnieje jakiś sposób, aby zgłosić błąd, jeśli próbuję „wysłuchać” nieistniejącego @Output
?
angular
angular-directive
angular9
dev_054
źródło
źródło
@Output()
bibliotekę współdzieloną lub nawet w aplikacji i zapomina usunąć połączenia ... a ponieważ nie mamy błędów kompilacji, tak jak my@Input()
, nie możemy znaleźć dokładnie tego, co powoduje pewne problemy (lub nawet za brak przechowywania śmieci w kodzie). Testy jednostkowe mogą być pomocne? Może, ale w tej chwili nie jest to jeszcze możliwe ze względu na czas.Odpowiedzi:
Nie ma błędu rzucony ponieważ wiązanie wydarzenie w kątowej służy nie tylko z
@Output
S iEventEmitter
S, ale również słuchać zdarzeń DOM , takich jakclick
,keyup
itd To może być nawet używany do słuchania niestandardowych zdarzeń . Na przykład, jeśli utworzysz i wyślesz niestandardowe zdarzenie w komponencie potomnym:Następnie w komponencie nadrzędnym możesz złapać go po nazwie:
Angular używa target.addEventListener (typ, detektor [, opcje]); wewnętrznie (możesz się upewnić, patrząc na poniższe linki), gdzie
type
może być dowolny ciąg.Dlatego nie zgłasza żadnego wyjątku, jeśli nie znajdzie pasujących
@Output
s.listenToElementOutputs
DefaultDomRenderer2.listen
EventManager.addEventListener
DomEventsPlugin.addEventListener
źródło
@Input()
(należy pamiętać, że Wejścia mają takie same właściwości: może być coś jak globalnedisabled
,id
itd) kątowe rzucił błędy? Dlaczego to działa@Input
, ale nie działa@Output
? Próbuję również znaleźć sposób, aby ostrzec / wyrzucić błąd, jeśli nieistniejący przejdzie@Output
.addEventListener
(dodam kilka linków do mojej odpowiedzi, aby ją pokazać). Myślę, że zostało to zrobione celowo, aby programiści mogli użyć powiązania zdarzeń z własnymi niestandardowymi zdarzeniami. Uważam, że nie ma sposobu, aby wyłączyć to zachowanie w czasie kompilacji. Chociaż niektóre IDE (jak Idea IntelliJ) mogą wyróżniać takie miejsca i wyświetlać ostrzeżenia.[attr.any-attribute]
w tym przypadku błąd nie zostanie wyrzucony albo.Nie ma bezpośredniego rozwiązania Twojego problemu, jednak niektóre przypadki mogą zostać objęte.
click
zdarzenie przycisku , możesz uczynić go częścią selektora, tjselector: 'app-test[selectionChange]'
. Możesz to również zrobić na przykład:selector: 'app-test[selectionChange]', app-test[click]'
znaczyclick
lubselectionChange
jest wymagane.selectionChange
, abyselectedChange
następnie można użyć tego selektor:selector: 'app-test:not([selectionChange])'
dla użytkowników sił, aby zaktualizować.źródło
Jeśli używasz VS Code, możesz zainstalować to rozszerzenie: Angular Language Service wyśle ostrzeżenie, gdy metoda lub właściwość nie zostaną zdefiniowane. To rozszerzenie działa zarówno z wyjściami, jak i wejściami (i atrybutami itp.).
źródło
@Output
Angular Language Service nic nie pomaga. Daj mi znać, jeśli potrzebujesz wyjaśnienia pytania.@Output
tego zobaczysz ten sam komunikat o błędzie.