Ich versuche, den Dokumenten unter https://material.angular.io/components/component/dialog zu folgen , kann aber nicht verstehen, warum das folgende Problem vorliegt.
Ich habe Folgendes zu meiner Komponente hinzugefügt:
@Component({
selector: 'dialog-result-example-dialog',
templateUrl: './dialog-result-example-dialog.html',
})
export class DialogResultExampleDialog {
constructor(public dialogRef: MdDialogRef<DialogResultExampleDialog>) {}
}
In meinem Modul habe ich hinzugefügt
import { HomeComponent,DialogResultExampleDialog } from './home/home.component';
@NgModule({
declarations: [
AppComponent,
LoginComponent,
DashboardComponent,
HomeComponent,
DialogResultExampleDialog
],
// ...
Trotzdem bekomme ich diesen Fehler ....
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
quelle
quelle
declarations
, um die Dinge zumSie müssen
entryComponents
unter verwenden@NgModule
.Dies gilt für dynamisch hinzugefügte Komponenten, die mit hinzugefügt werden
ViewContainerRef.createComponent()
. Durch Hinzufügen zu entryComponents wird der Offline-Vorlagen-Compiler angewiesen, sie zu kompilieren und Fabriken für sie zu erstellen.Die in Routenkonfigurationen registrierten Komponenten werden ebenfalls automatisch hinzugefügt,
entryComponents
da sierouter-outlet
auchViewContainerRef.createComponent()
zum Hinzufügen gerouteter Komponenten zum DOM verwendet werden.Ihr Code wird also so sein
quelle
Dies geschieht , weil dies eine ist dynamische Komponente , und Sie haben es nicht hinzuzufügen
entryComponents
unter@NgModule
.Fügen Sie es einfach dort hinzu:
Sehen Sie sich an, wie das Angular-Team darüber spricht
entryComponents
:Dies ist auch die Liste der Methoden zum
@NgModule
Einschließen vonentryComponents
...Wie Sie sehen können, sind alle optional (siehe Fragezeichen), einschließlich
entryComponents
derer, die eine Reihe von Komponenten akzeptieren:quelle
Wenn Sie versuchen,
MatDialog
innerhalb eines Dienstes zu verwenden, rufen wir ihn auf'PopupService'
und dieser Dienst wird in einem Modul definiert mit:dann kann es nicht funktionieren. Ich verwende Lazy Loading, bin mir aber nicht sicher, ob das relevant ist oder nicht.
Sie müssen:
PopupService
direkt der Komponente zur Verfügung, die Ihren Dialog öffnet - mit[ provide: PopupService ]
. Dies ermöglicht es ihm, (mit DI) dieMatDialog
Instanz in der Komponente zu verwenden. Ich denke, der Komponentenaufrufopen
muss sich in diesem Fall im selben Modul wie die Dialogkomponente befinden.matDialog
wenn Sie Ihren Dienst anrufen.Entschuldigen Sie meine durcheinandergebrachte Antwort. Der Punkt ist,
providedIn: 'root'
dass die Dinge kaputt gehen, weil MatDialog eine Komponente huckepack nehmen muss.quelle
Im Falle eines verzögerten Ladens müssen Sie nur MatDialogModule in ein verzögert geladenes Modul importieren . Dann kann dieses Modul die Eintragskomponente mit seinem eigenen importierten MatDialogModule rendern :
quelle
Während die Integration von Materialdialogen möglich ist , habe ich festgestellt, dass die Komplexität für solch ein triviales Feature ziemlich hoch ist. Der Code wird komplexer, wenn Sie versuchen, nicht triviale Funktionen zu erzielen.
Aus diesem Grund habe ich schließlich PrimeNG Dialog verwendet , was ich als ziemlich einfach empfand :
m-dialog.component.html
::m-dialog.component.ts
::m-dialog.module.ts
::Fügen Sie einfach Ihren Dialog in das HTML Ihrer Komponente ein:
Die PrimeNG PrimeFaces-Dokumentation ist einfach zu befolgen und sehr präzise.
quelle
Sie müssen es hinzufügen
entryComponents
, wie in den Dokumenten angegeben .Hier ist ein vollständiges Beispiel für eine App-Moduldatei mit einem Dialogfeld, das als definiert ist
entryComponents
.quelle
Wenn Sie wie ich sind und auf diesen Thread starren und denken: "Aber ich versuche nicht, eine Komponente hinzuzufügen, ich versuche, einen Schutz / Service / Rohr usw. hinzuzufügen." In diesem Fall ist es wahrscheinlich, dass Sie einem Routing-Pfad den falschen Typ hinzugefügt haben. Das habe ich getan. Ich habe versehentlich einen Schutz für den Abschnitt component: eines Pfads anstelle des Abschnitts canActivate: hinzugefügt. Ich liebe die automatische Vervollständigung von IDE, aber Sie müssen etwas langsamer fahren und aufpassen. Wenn Sie es absolut nicht finden können, führen Sie eine globale Suche nach dem Namen durch, über den es sich beschwert, und überprüfen Sie jede Verwendung, um sicherzustellen, dass Sie nicht mit einem Namen verrutscht sind.
quelle
In meinem Fall habe ich meine Komponente zu Deklarationen und entryComponents hinzugefügt und die gleichen Fehler erhalten. Ich musste auch MatDialogModule zu Importen hinzufügen.
quelle
Wenn jemand Dialog von den Diensten aus aufrufen muss, können Sie das Problem hier lösen. Ich bin mit einigen der oben genannten Antworten einverstanden. Meine Antwort besteht darin, den Dialog in Diensten aufzurufen, wenn jemand auf Probleme stößt.
Erstellen Sie einen Dienst, zum Beispiel DialogService, verschieben Sie dann Ihre Dialogfunktion innerhalb der Dienste und fügen Sie Ihren Dialogdienst in der Komponente hinzu, die Sie wie folgt aufrufen:
Andernfalls erhalten Sie eine Fehlermeldung
quelle