navigationend example change angular ngoninit

angular - example - ¿Por qué se llama a ngOnInit dos veces?



navigationend angular 6 (13)

¿Por qué se llama dos veces?

En este momento, si se produce un error durante la detección de cambios de contenido / vista hijos de un componente, se llamará a ngOnInit dos veces (visto en DynamicChangeDetector). Esto puede conducir a errores de seguimiento que ocultan el error original.

Esta información proviene de este problema de github

Por lo tanto, parece que su error puede tener un origen en otra parte de su código, relacionado con este componente.

ResultComponent crear un nuevo componente, ResultComponent , pero su método ngOnInit() se llama dos veces y no sé por qué sucede esto. En el código, ResultComponent hereda @Input del componente principal mcq-component .

Aquí está el código:

Componente principal (MCQComponent)

import { Component, OnInit } from ''@angular/core''; @Component({ selector: ''mcq-component'', template: ` <div *ngIf = ''isQuestionView''> ..... </div> <result-comp *ngIf = ''!isQuestionView'' [answers] = ''ansArray''><result-comp> `, styles: [ ` .... ` ], providers: [AppService], directives: [SelectableDirective, ResultComponent] }) export class MCQComponent implements OnInit{ private ansArray:Array<any> = []; .... constructor(private appService: AppService){} .... }

Componente secundario (compilación de resultados)

import { Component, OnInit, Input } from ''@angular/core''; @Component({ selector:''result-comp'', template: ` <h2>Result page:</h2> ` }) export class ResultComponent implements OnInit{ @Input(''answers'') ans:Array<any>; ngOnInit(){ console.log(''Ans array: ''+this.ans); } }

Cuando se ejecuta, console.log se muestra dos veces, la primera vez que muestra la matriz correcta pero la segunda vez que undefined . No he podido resolverlo: ¿por qué se ngOnInit a ResultComponent en ResultComponent dos veces?


Bueno, el problema en mi caso fue la forma en que estaba iniciando los componentes secundarios. En el objeto de metadatos de mi decorador @NgModule , estaba pasando '' componente secundario '' en la propiedad bootstap junto con '' componente principal ''. Pasar los componentes secundarios en la propiedad bootstap fue restablecer las propiedades de mis componentes secundarios y hacer que OnInit () se disparara dos veces.

@NgModule({ imports: [ BrowserModule,FormsModule ], // to use two-way data binding ‘FormsModule’ declarations: [ parentComponent,Child1,Child2], //all components //bootstrap: [parentComponent,Child1,Child2] // will lead to errors in binding Inputs in Child components bootstrap: [parentComponent] //use parent components only })


El ngOnInit() engancha solo una vez después de que se hayan instanciado todas las directivas. Si tiene una suscripción dentro de ngOnInit() y no está cancelada, se ejecutará nuevamente si los datos suscritos cambian.

En el siguiente ejemplo de Stackblitz, tengo una suscripción dentro de ngOnInit() y consuelo el resultado. Se consola dos veces porque se carga una vez y los datos cambian y se vuelve a cargar.

Stackblitz


En mi caso, esto sucede cuando Component implementa OnChanges y OnInit . Intenta eliminar una de estas clases. También puede usar el método ngAfterViewInit , se activa después de que se inicializa la vista, por lo que se garantiza que se llamará una vez.


En mi caso, no cancelé la suscripción a todas las suscripciones que tenía dentro de ngOnInit. Acabo de darme de baja de todas las suscripciones dentro de ngOnDestroy y eso resolvió mi problema.


Esto me estaba sucediendo debido a un componente defectuoso html. Olvidé cerrar la etiqueta del selector en el componente host. Así que tuve este <search><search> , en lugar de <search></search> - tome nota del error de sintaxis.

Entonces, en relación con la respuesta @dylan, verifique la estructura html de su componente y la de su padre.


Esto me sucedió porque tenía un nombre sin nombre <router-outlet> s dentro de un *ngFor . Se cargó para cada iteración en el bucle.

La solución, en ese caso, sería tener un nombre único para cada salida o asegurarse de que solo haya uno en el DOM a la vez (tal vez w / an *ngIf ).


Esto puede suceder porque configura AppComponent como su ruta predeterminada

RouterModule.forRoot([ { path: '''', component: AppComponent } // remove it ])

Nota: AppComponent se llama por defecto en angular por lo que no es necesario llamarlo


Esto sucede cada vez que hay errores de plantilla.

En mi caso, estaba usando una referencia de plantilla incorrecta y corrigiendo que solucionó mi problema.


Para mí, esto sucedió porque registré el mismo componente dos veces en Ruta:

{ path: ''meal-services'', children: [ { path: '''', component: InitTwiceComponent, canActivate: [AppVendorOpsGuard], data: { roleWhitelist: [UserRoles.Manage] } }, { path: '':itemID'', component: InitTwiceComponent, canActivate: [AppVendorOpsGuard], data: { roleWhitelist: [UserRoles.Manage] } }] }, }


Poner esto aquí en caso de que alguien termine aquí. NgOnInit también se puede llamar dos veces si el tipo de botón predeterminado de su navegador es "enviar", digamos que si tiene lo siguiente, se llamará dos veces a NgOnInit de NextComponent en Chrome:

<button class="btn btn-primary" (click)="navigateToNextComponent()">

Para solucionarlo, establezca el tipo:

<button class="btn btn-primary" type="button" (click)="navigateToNextComponent()">


Tuve un problema similar, estaba llamando a un componente y luego haciendo referencia al mismo componente a través del enrutador.

<layout> <router-outlet></router-outlet> </layout>

Y la ruta de salida también apuntaba a Layout.


si usó platformBrowserDynamic().bootstrapModule(AppModule); en app.module.ts coméntalo e inténtalo. Yo tuve el mismo problema. Creo que esto ayuda