Próbuję postępować zgodnie z dokumentami na https://material.angular.io/components/component/dialog, ale nie rozumiem, dlaczego występuje poniższy problem?
Dodałem poniżej do mojego komponentu:
@Component({
selector: 'dialog-result-example-dialog',
templateUrl: './dialog-result-example-dialog.html',
})
export class DialogResultExampleDialog {
constructor(public dialogRef: MdDialogRef<DialogResultExampleDialog>) {}
}
W moim module dodałem
import { HomeComponent,DialogResultExampleDialog } from './home/home.component';
@NgModule({
declarations: [
AppComponent,
LoginComponent,
DashboardComponent,
HomeComponent,
DialogResultExampleDialog
],
// ...
Jednak dostaję ten błąd ....
EXCEPTION: Error in ./HomeComponent class HomeComponent - inline template:53:0 caused by: No component factory found for DialogResultExampleDialog. Did you add it to @NgModule.entryComponents?
ErrorHandler.handleError @ error_handler.js:50
next @ application_ref.js:346
schedulerFn @ async.js:91
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223
SafeSubscriber.next @ Subscriber.js:172
Subscriber._next @ Subscriber.js:125
Subscriber.next @ Subscriber.js:89
Subject.next @ Subject.js:55
EventEmitter.emit @ async.js:77
NgZone.triggerError @ ng_zone.js:329
onHandleError @ ng_zone.js:290
ZoneDelegate.handleError @ zone.js:246
Zone.runTask @ zone.js:154
ZoneTask.invoke @ zone.js:345
error_handler.js:52 ORIGINAL EXCEPTION: No component factory found for DialogResultExampleDialog. Did you add it to @NgModule.entryComponents?
ErrorHandler.handleError @ error_handler.js:52
next @ application_ref.js:346
schedulerFn @ async.js:91
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223
SafeSubscriber.next @ Subscriber.js:172
Subscriber._next @ Subscriber.js:125
Subscriber.next @ Subscriber.js:89
Subject.next @ Subject.js:55
EventEmitter.emit @ async.js:77
NgZone.triggerError @ ng_zone.js:329
onHandleError @ ng_zone.js:290
ZoneDelegate.handleError @ zone.js:246
Zone.runTask @ zone.js:154
ZoneTask.invoke @ zone.js:345
angular
angular-material
Tampa
źródło
źródło
declarations
wszystko działałoMusisz użyć
entryComponents
pod@NgModule
.Dotyczy to składników dodawanych dynamicznie, które są dodawane za pomocą
ViewContainerRef.createComponent()
. Dodanie ich do entryComponents każe kompilatorowi szablonów offline skompilować je i utworzyć dla nich fabryki.Komponenty zarejestrowane w konfiguracjach tras również są dodawane automatycznie,
entryComponents
ponieważrouter-outlet
również służąViewContainerRef.createComponent()
do dodawania komponentów trasowanych do DOM.Twój kod będzie podobny
źródło
Dzieje się tak, ponieważ jest to element dynamiczny i nie dodałeś go do
entryComponents
under@NgModule
.Po prostu dodaj go tam:
Zobacz, jak mówi zespół Angular
entryComponents
:Jest to także lista metod
@NgModule
obejmującychentryComponents
...Jak widać, wszystkie z nich są opcjonalne (spójrz na znaki zapytania), w tym
entryComponents
akceptują szereg komponentów:źródło
Jeśli próbujesz użyć
MatDialog
wewnątrz usługi - nazwijmy ją,'PopupService'
a ta usługa jest zdefiniowana w module z:to może nie działać. Używam leniwego ładowania, ale nie jestem pewien, czy to jest istotne, czy nie.
Musisz:
PopupService
bezpośrednio komponentowi, który otwiera okno dialogowe - za pomocą[ provide: PopupService ]
. Pozwala to na użycie (z DI)MatDialog
instancji w komponencie. Myślę, że w tym przypadku wywołanie komponentuopen
musi znajdować się w tym samym module co komponent okna dialogowego.matDialog
kiedy zadzwonisz do serwisu.Przepraszam, moja pomieszana odpowiedź, chodzi o to,
providedIn: 'root'
że to psuje rzeczy, ponieważ MatDialog musi odeprzeć komponent.źródło
W przypadku leniwego ładowania wystarczy zaimportować MatDialogModule do modułu leniwie ładowanego. Następnie ten moduł będzie mógł renderować komponent wejścia z własnym importowanym MatDialogModule :
źródło
Chociaż integracja dialogów materiałowych jest możliwa , stwierdziłem, że złożoność tak trywialnej funkcji jest dość wysoka. Kod staje się bardziej złożony, jeśli próbujesz uzyskać nietrywialne funkcje.
Z tego powodu korzystałem z PrimeNG Dialog , co było dość proste w użyciu:
m-dialog.component.html
:m-dialog.component.ts
:m-dialog.module.ts
:Po prostu dodaj okno dialogowe do html komponentu:
Dokumentacja PrimeNG PrimeFaces jest łatwa do śledzenia i bardzo precyzyjna.
źródło
Musisz go dodać
entryComponents
, jak określono w dokumentach .Oto pełny przykład pliku modułu aplikacji z oknem dialogowym zdefiniowanym jako
entryComponents
.źródło
Jeśli jesteś podobny do mnie i gapisz się na ten wątek, myśląc: „Ale nie próbuję dodawać komponentu, próbuję dodać osłonę / usługę / rurę itp.” problem prawdopodobnie spowodował, że dodałeś niewłaściwy typ do ścieżki routingu. Tak zrobiłem. Przypadkowo dodałem zabezpieczenie do komponentu: sekcja ścieżki zamiast sekcji canActivate:. Uwielbiam autouzupełnianie IDE, ale trzeba trochę zwolnić i zwrócić uwagę. Jeśli absolutnie nie możesz go znaleźć, przeszukaj globalnie nazwę, na którą się skarży, i spójrz na każde użycie, aby upewnić się, że nie wpadłeś w błąd z nazwiskiem.
źródło
W moim przypadku dodałem mój komponent do deklaracji i entryComponents i otrzymałem te same błędy. Musiałem także dodać MatDialogModule do importu.
źródło
Jeśli ktoś musi zadzwonić do Dialog z usług, tutaj jest sposób rozwiązania problemu. Zgadzam się z niektórymi z powyższych odpowiedzi, moja odpowiedź dotyczy wywoływania dialogu w usługach, jeśli ktoś może napotkać problemy.
Utwórz usługę, na przykład DialogService, a następnie przenieś funkcję dialogu do usług i dodaj swoją usługę dialogową do komponentu, który wywołujesz, jak poniżej:
w przeciwnym razie pojawi się błąd
źródło