2017-06-26 41 views
6

Buduję aplikację przy użyciu Angulara połączonego z materiałem kątowym i mam pewne problemy ze strukturą modułów.Jak poprawnie zaimportować moduł Angular Material przez wspólny moduł w Angular 4?

Zgodnie z wytycznymi, importowanie modułu materiałowego jest nieaktualne i nie powinno już być wykonywane, dlatego stworzyłem oddzielny moduł materiałowy, w którym tylko importuję moduły materiałów, których potrzebuję użyć; moduł ten jest następnie importowany do SharedModule, który jest ostatecznie importowany wszędzie tam, gdzie jest potrzebny, w tym główny AppModule.

Jednym z używanych przeze mnie Materiałów jest MdTooltip, i wszystko działa dobrze, z wyjątkiem sytuacji, gdy testuję swoją aplikację na tablecie: co się dzieje, to, że podpowiedzi nie reagują na długie krany, jak na przykład przypuszczam, i nie otworzą się. Jedynym sposobem, w jaki udało mi się to zrobić, jest importowanie pełnego modułu MaterialModule (z @ kątowego/materiału) w moim AppModule, co jest horrendalnie złe i nieeleganckie. Każde inne podejście nie wydawało się, by to przerwać, ponieważ wszystkie one przyniosłyby własne problemy, nie rozwiązując próby.

To są moje moduły (pozbawione zbędnych sprawozdań import):

MaterialModule:

import { NgModule } from '@angular/core'; 
import {...} from '@angular/material'; 

@NgModule({ 
    imports: [ 
    MdGridListModule, 
    MdButtonModule, 
    MdTabsModule, 
    MdToolbarModule, 
    MdCardModule, 
    MdInputModule, 
    MdSelectModule, 
    MdAutocompleteModule, 
    MdIconModule, 
    MdTooltipModule 
    ], 
    exports: [ 
    MdGridListModule, 
    MdButtonModule, 
    MdTabsModule, 
    MdToolbarModule, 
    MdCardModule, 
    MdInputModule, 
    MdSelectModule, 
    MdAutocompleteModule, 
    MdIconModule, 
    MdTooltipModule 
    ], 
    providers: [ 
    MdIconRegistry 
    ] 
}) 

export class MaterialModule {} 

SharedModule:

import { MaterialModule } from '../material/app-material.module'; 
@NgModule({ 
    imports:  [ 
    CommonModule, 
    MaterialModule, 
    FlexLayoutModule, 
    FormsModule, 
    ReactiveFormsModule 
    ], 
    declarations: [ 
    NavbarComponent, 
    SearchFiltersComponent, 
    RightCurrencyPipe 
    ], 
    exports:  [ 
    CommonModule, 
    FormsModule, 
    ReactiveFormsModule, 
    MaterialModule, 
    FlexLayoutModule, 
    NavbarComponent, 
    RightCurrencyPipe, 
    SearchFiltersComponent 
    ], 
    providers: [ 
    SpinnerService, 
    ProductsService, 
    StatePersistenceService 
    ] 
}) 

export class SharedModule {} 

AppModule:

import { MaterialModule } from "@angular/material"; 
@NgModule({ 
    declarations: [ 
    AppComponent, 
    ProductPageComponent 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule, 
    RouterModule, 
    BrowserAnimationsModule, 
    AppRoutingModule, 
    SharedModule, 
    CoreModule, 
    LoginModule, 
    MaterialModule 
    ], 
    providers: [], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

jestem doi coś złego? Jak byś podzielił swoją aplikację na submoduły?

góry dzięki

+1

Zrobiłem to samo, ale dostałem "StaticInjectorError [ElementRef]:" błąd, wszystko jest załadowane, ale kątowe komponenty materiału nie działają. nie masz pojęcia, dlaczego? – molikh

Odpowiedz

0

W zależności od kompilacji i strategii wdrażania będziesz chciał użyć drzewa drżenie (dla eliminacji martwego kodu lub kodu żywo importu). Jest to główna motywacja do wycofania MaterialModule. Oficjalna sugestia dotyczy only import the components you need w modułach, które jej potrzebują. Twoje rozwiązanie polegające na utworzeniu pojedynczego MaterialModule ze wszystkimi importami powoduje cofnięcie tego aspektu, ale może działać w zależności od struktury projektu (jeśli na przykład używasz tylko jednego modułu).

Spróbuj usunąć MaterialModule z eksportów SharedModule. W ten sposób masz tylko jeden punkt wejścia dla modułu w katalogu głównym aplikacji.

+0

To była wnikliwa odpowiedź, ale jest coś, czego nie udało mi się rozwiązać za pomocą pierwotnego pytania. Komponenty zadeklarowane i wyeksportowane przez SharedModule szeroko wykorzystują komponenty Material, co powoduje konieczność importowania mojego MaterialModule (lub pojedynczych komponentów); tooltipy nie działają jednak poprawnie. To, co działa, to importowanie przestarzałego modułu materiałowego do mojego modułu AppModule przy jednoczesnym pozostawieniu mojego niestandardowego modułu materiałowego zaimportowanego do mojego modułu SharedModule. Dlaczego potrzebny jest pełny MaterialModule do zaimportowania w katalogu głównym? Właśnie to robię. – Samuele

+0

Możesz chcieć sprawdzić zainstalowane wersje w module node_modules: przestarzały 'MaterialModule' nie powinien nic robić z najnowszymi wersjami. Jak widzę masz dwa komponenty w module "SharedModule' i dwa w' AppModule' (to jest [polecane] (https://angular.io/guide/styleguide#feature-modules), aby umieścić je w swoim własnym module). Co jeśli nie eksportowałeś z 'SharedModule' i nie importowałeś określonych w' AppModule', którego potrzebujesz do swoich komponentów ('AppComponent',' ProductPageComponent')? – Raven

+0

Masz rację, jeśli chodzi o przestarzały MaterialModule, który w zasadzie nic nie robi, a jedynie jest pustą klasą. Próbowałem zaimportować wszystkie potrzebne moduły w każdym module i wszystko działa, z wyjątkiem funkcji dotykowej. Z jakiegoś powodu jedynym sposobem, aby to zadziałało, jest importowanie wycofanego modułu materiałowego do mojego głównego modułu AppModule, bez względu na to, co jeszcze zrobię. Jeśli go zaimportuję, otrzymam funkcję dotyku, jeśli go nie zaimportuję, nie działa. Nie ma to dla mnie większego sensu, szczerze mówiąc, czy może zależeć od tego, skąd importowane są pliki hammer.js i BrowserModule? – Samuele

1

Twoje podejście jest wspaniałe. Struktura, którą zaprezentowałeś, jest alternatywą, która została zaprezentowana w pliku material.angular.io. Nie jestem pewien, dlaczego twoja podpowiedź nie działa. Ale chciałbym doradzić, aby użyć tylko jednego modułu MaterialModule tylko jeden raz na module głównym. Nie ma potrzeby ponownego importowania go do modułu SharedModule.