Estou tentando seguir os documentos em https://material.angular.io/components/component/dialog, mas não consigo entender por que ele tem o problema abaixo?
Eu adicionei o seguinte no meu componente:
@Component({
selector: 'dialog-result-example-dialog',
templateUrl: './dialog-result-example-dialog.html',
})
export class DialogResultExampleDialog {
constructor(public dialogRef: MdDialogRef<DialogResultExampleDialog>) {}
}
No meu módulo eu adicionei
import { HomeComponent,DialogResultExampleDialog } from './home/home.component';
@NgModule({
declarations: [
AppComponent,
LoginComponent,
DashboardComponent,
HomeComponent,
DialogResultExampleDialog
],
// ...
No entanto, recebo esse erro ....
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
fonte
fonte
declarations
fazer as coisas para o trabalhoVocê precisa usar
entryComponents
em@NgModule
.Isto é para componentes adicionados dinamicamente que são adicionados usando
ViewContainerRef.createComponent()
. Adicioná-los a entryComponents informa ao compilador de modelos offline para compilá-los e criar fábricas para eles.Os componentes registrados nas configurações de rota também são adicionados automaticamente
entryComponents
porquerouter-outlet
também são usadosViewContainerRef.createComponent()
para adicionar componentes roteados ao DOM.Então, seu código será como
fonte
Isso está acontecendo porque este é um componente dinâmico e você não o adicionou ao
entryComponents
sub@NgModule
.Basta adicioná-lo lá:
Veja como a equipe Angular fala sobre
entryComponents
:Além disso, esta é a lista dos métodos para
@NgModule
incluirentryComponents
...Como você pode ver, todos eles são opcionais (veja os pontos de interrogação), incluindo os
entryComponents
que aceitam uma matriz de componentes:fonte
Se você estiver tentando usar
MatDialog
dentro de um serviço - vamos chamá-lo'PopupService'
e esse serviço é definido em um módulo com:então pode não funcionar. Estou usando carregamento lento, mas não tenho certeza se isso é relevante ou não.
Voce tem que:
PopupService
diretamente ao componente que abre sua caixa de diálogo - usando[ provide: PopupService ]
. Isso permite usar (com DI) aMatDialog
instância no componente. Eu acho que a chamada de componenteopen
precisa estar no mesmo módulo que o componente de diálogo nesta instância.matDialog
quando você ligar para o seu serviço.Desculpe minha resposta confusa, o ponto é que é isso
providedIn: 'root'
que está quebrando as coisas, porque o MatDialog precisa retroceder um componente.fonte
No caso de carregamento lento, você só precisa importar o MatDialogModule no módulo carregado lento. Então este módulo poderá renderizar o componente de entrada com seu próprio MatDialogModule importado :
fonte
Embora a integração do diálogo de material seja possível , descobri que a complexidade de um recurso tão trivial é bastante alta. O código fica mais complexo se você estiver tentando obter recursos não triviais.
Por esse motivo, acabei usando o PrimeNG Dialog , que achei bastante simples de usar:
m-dialog.component.html
:m-dialog.component.ts
:m-dialog.module.ts
:Basta adicionar sua caixa de diálogo ao html do seu componente:
A documentação do PrimeNG PrimeFaces é fácil de seguir e muito precisa.
fonte
Você deve adicioná-lo
entryComponents
, conforme especificado nos documentos .Aqui está um exemplo completo de um arquivo de módulo de aplicativo com uma caixa de diálogo definida como
entryComponents
.fonte
Se você é como eu, e está olhando para este tópico pensando "Mas não estou tentando adicionar um componente, estou tentando adicionar um protetor / serviço / tubo, etc." é provável que o problema tenha sido adicionado ao tipo de caminho errado. Foi o que eu fiz. Eu acidentalmente adicionei uma proteção à seção component: de um caminho em vez da seção canActivate:. Eu amo o preenchimento automático do IDE, mas você precisa desacelerar um pouco e prestar atenção. Se você não conseguir encontrá-lo, faça uma pesquisa global pelo nome do qual está reclamando e verifique todos os usos para garantir que você não tenha escolhido um nome.
fonte
No meu caso, adicionei meu componente a declarações e entryComponents e obtive os mesmos erros. Eu também precisava adicionar MatDialogModule às importações.
fonte
Se alguém precisar chamar a Dialog de serviços, aqui está como resolver o problema. Concordo com algumas das respostas acima, minha resposta é para chamar a caixa de diálogo nos serviços se alguém tiver problemas.
Crie um serviço, por exemplo, DialogService, mova sua função de diálogo dentro dos serviços e adicione seu serviço de diálogo no componente que você chama, como no código abaixo:
caso contrário, você receberá um erro
fonte