2015-12-16 14 views
5

Największy problem z Angular 1 polega na tym, jak trudno jest rozszerzyć (w sensie obiektowym) dyrektywę.Czy dyrektywy Angular 2 są obecnie "rozszerzalne"?

Na przykład prawie niemożliwe jest ponowne użycie dyrektywy input[number] w moim niestandardowym widżecie i musiałem ponownie wdrożyć cały kod sprawdzania poprawności i typu.

Angular 2 komponenty są implementowane jako klasy, więc wydaje się, że można je łatwo rozszerzyć. Jednak mają również tę adnotację z bardzo specyficznymi selektorami itp., Co sprawia, że ​​nie jest dla mnie jasne, czy można je w pełni przesłonić.

Czy dyrektywy Angular 2 są rzeczywiście rozszerzalne?

Edit:

Dobra, "rozciągliwe" nie musi być rozszerzenie klas. Może to być tworzenie nowej dyrektywy, która składa się z wielu istniejących dyrektyw. Moje pytanie dotyczące tego podejścia brzmi: jaki jest mechanizm stosowania dyrektyw dotyczących dzieci?

(The @Component klasy nie są tradycyjne zajęcia oo z metod, które można wysyłają do dzieci. To jest tylko pojemnik z pól i wywołania zwrotne, które są całkowicie napędzany przez co jest za adnotacji.)

Odpowiedz

5

Adnotacje nie dziedziczone, więc jeśli masz:

@Directive({ 
    selector:'foo', 
    inputs:['bar'] 
}) 
export class Foo {} 


//no annotation 
export class FooBar extends Foo {} //not a directive 


@Directive({ 
    selector:'foobaz' 
}) 
export class FooBaz extends Foo {} //is a directive, but has no inputs 

FooBar nie zostanie rozpoznany jako dyrektywa w ogóle, a FooBaz będzie ale nie będzie wejście bar (lub jakiekolwiek inne). Tak więc, , jeśli dziedziczenie jest naprawdę, co ma największy sens w przypadku użycia-case , sposób podejścia do tego byłoby zadeklarować dane wejściowe itp. W adnotacjach klasy potomnej i przekazać je jako argumenty konstruktora do klasy nadrzędnej, gdzie możesz obudować wspólną funkcjonalność.

To powiedziawszy, nie sądzę, aby rozciągliwość koniecznie implikowała dziedziczenie, a z mojego doświadczenia wynika, że ​​stare powiedzenie "faworyzuje kompozycję nad dziedziczeniem" jest podwójnie prawdziwe, gdy bierze się pod uwagę DI.

Ktoś, o wiele mądrzejszy ode mnie, powiedział: "spadkobierca zamorduje twoje dzieci we śnie", a ja sam staram się trzymać tego punktu widzenia, chyba że jestem przekonany, że jest to odpowiednie narzędzie dla mojego przypadku użycia.

+1

Witam, całkowicie zgadzam się z tobą na temat "faworyzowania składu na dziedziczenie", ale nie jest to tak proste w przypadku komponentów Angular. Zobacz moją edycję powyżej. –