page navigationend cambiar angular angular2-meteor

angular - navigationend - Intente utilizar una vista destruida: detectChanges



title angular 6 (14)

Estoy creando una interfaz de usuario simple usando Angular Meteor 2.

1) Tengo un componente superior de la barra de navegación que tiene un botón de ''cerrar sesión''.
2) Al hacer clic en el botón ''cerrar sesión'' se redirige a ''iniciar sesión''.
3) Luego veo este error en la consola: EXCEPTION: Attempt to use a destroyed view: detectChanges

Excepción:

EXCEPTION: Attempt to use a destroyed view: detectChanges browser_adapter.js:77 EXCEPTION: Attempt to use a destroyed view: detectChangesBrowserDomAdapter.logError @ browser_adapter.js:77BrowserDomAdapter.logGroup @ browser_adapter.js:87ExceptionHandler.call @ exception_handler.js:57(anonymous function) @ application_ref.js:265schedulerFn @ async.js:123SafeSubscriber.__tryOrUnsub @ Subscriber.js:225SafeSubscriber.next @ Subscriber.js:174Subscriber._next @ Subscriber.js:124Subscriber.next @ Subscriber.js:88Subject._finalNext @ Subject.js:128Subject._next @ Subject.js:120Subject.next @ Subject.js:77EventEmitter.emit @ async.js:112onError @ ng_zone.js:120onHandleError @ ng_zone_impl.js:66ZoneDelegate.handleError @ angular2-polyfills.js:394Zone.runTask @ angular2-polyfills.js:323ZoneTask.invoke @ angular2-polyfills.js:490 browser_adapter.js:77 STACKTRACE:BrowserDomAdapter.logError @ browser_adapter.js:77ExceptionHandler.call @ exception_handler.js:59(anonymous function) @ application_ref.js:265schedulerFn @ async.js:123SafeSubscriber.__tryOrUnsub @ Subscriber.js:225SafeSubscriber.next @ Subscriber.js:174Subscriber._next @ Subscriber.js:124Subscriber.next @ Subscriber.js:88Subject._finalNext @ Subject.js:128Subject._next @ Subject.js:120Subject.next @ Subject.js:77EventEmitter.emit @ async.js:112onError @ ng_zone.js:120onHandleError @ ng_zone_impl.js:66ZoneDelegate.handleError @ angular2-polyfills.js:394Zone.runTask @ angular2-polyfills.js:323ZoneTask.invoke @ angular2-polyfills.js:490 browser_adapter.js:77 Error: Attempt to use a destroyed view: detectChanges at ViewDestroyedException.BaseException [as constructor] (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:3349:23) at new ViewDestroyedException (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:10626:16) at DebugAppView.AppView.throwDestroyedError (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11277:72) at DebugAppView.AppView.detectChanges (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11230:18) at DebugAppView.detectChanges (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11321:44) at ViewRef_.detectChanges (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11011:65) at http://localhost:3000/app/app.js?hash=323b1216814e80ed467d95bcda255eb217d7c468:2224:23 at ZoneDelegate.invokeTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4721:174) at Object.onInvokeTask (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9393:41) at ZoneDelegate.invokeTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4721:72) ------------- Elapsed: 80 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT) ------------- at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30) at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57) at Zone.scheduleMacroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4652:47) at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4467:37 at setTimeout (eval at createNamedFn (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5346:24), <anonymous>:3:37) at new TopNavbarComponent (http://localhost:3000/app/app.js?hash=323b1216814e80ed467d95bcda255eb217d7c468:2221:9) at DebugAppView._View_HomeComponent0.createInternal (HomeComponent.template.js:48:34) at DebugAppView.AppView.create (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:11098:21) ------------- Elapsed: 2 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT) ------------- at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30) at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57) at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47) at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22) at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29) at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4930:25 at ZoneDelegate.invokeTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4721:174) at Object.onInvokeTask (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9393:41) ------------- Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT) ------------- at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30) at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57) at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47) at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22) at ZoneAwarePromise.then (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5011:25) at RuntimeCompiler.resolveComponent (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:40230:14) at DynamicComponentLoader_.loadNextToLocation (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:10788:31) at RouterOutlet.activate (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:26844:26) ------------- Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT) ------------- at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30) at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57) at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47) at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22) at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29) at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4877:21 at ZoneDelegate.invoke (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4696:161) at Object.onInvoke (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9402:41) ------------- Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT) ------------- at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30) at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57) at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47) at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22) at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29) at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4877:21 at ZoneDelegate.invoke (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4696:161) at Object.onInvoke (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9402:41) ------------- Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT) ------------- at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30) at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57) at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47) at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22) at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29) at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4930:25 at ZoneDelegate.invokeTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4721:174) at Object.onInvokeTask (http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:9393:41) ------------- Elapsed: 1 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT) ------------- at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30) at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57) at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47) at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22) at ZoneAwarePromise.then (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5011:25) at http://localhost:3000/packages/modules.js?hash=560db94ec01c0b3e8f499491ffcce7a2ec6c3c5e:26895:53 at http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:1105:22 at ZoneDelegate.invoke (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4696:161) ------------- Elapsed: 0 ms; At: Wed Jun 15 2016 20:22:09 GMT-0700 (PDT) ------------- at Object.onScheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:5734:30) at ZoneDelegate.scheduleTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4704:57) at Zone.scheduleMicroTask (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4649:47) at scheduleResolveOrReject (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4928:22) at resolvePromise (http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4893:29) at http://localhost:3000/packages/barbatus_angular2-runtime.js?hash=fda9b73362c52e988ad030102a9f58e4d584cda3:4877:21 at http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:1105:22BrowserDomAdapter.logError @ browser_adapter.js:77ExceptionHandler.call @ exception_handler.js:60(anonymous function) @ application_ref.js:265schedulerFn @ async.js:123SafeSubscriber.__tryOrUnsub @ Subscriber.js:225SafeSubscriber.next @ Subscriber.js:174Subscriber._next @ Subscriber.js:124Subscriber.next @ Subscriber.js:88Subject._finalNext @ Subject.js:128Subject._next @ Subject.js:120Subject.next @ Subject.js:77EventEmitter.emit @ async.js:112onError @ ng_zone.js:120onHandleError @ ng_zone_impl.js:66ZoneDelegate.handleError @ angular2-polyfills.js:394Zone.runTask @ angular2-polyfills.js:323ZoneTask.invoke @ angular2-polyfills.js:490 Subscriber.js:229 Uncaught Attempt to use a destroyed view: detectChanges

top-navbar.component.ts

"use strict"; import {Logger} from "../services/logger.service"; import {Component, ChangeDetectionStrategy, ChangeDetectorRef} from ''@angular/core''; import {User} from "../models/user"; import {Router} from ''@angular/router-deprecated''; import {UserService} from "../services/user.service"; import {CORE_DIRECTIVES} from ''@angular/common''; import {DROPDOWN_DIRECTIVES} from ''../../node_modules/ng2-bootstrap''; @Component({ selector: ''top-navbar'', templateUrl: ''client/top-navbar/top-navbar.html'', bindings: [UserService, Logger], directives: [CORE_DIRECTIVES, DROPDOWN_DIRECTIVES] }) export class TopNavbarComponent { public user:User; public statusDropdown = { isOpen: false }; constructor(private userService:UserService, private router:Router, private logger:Logger, private ref:ChangeDetectorRef) { setTimeout(() => { this.ref.markForCheck(); this.user = this.userService.getLoggedInUser(); this.ref.detectChanges(); }, 0) } logout() { this.logger.warn(''[Top Navbar] Logging out the user.''); localStorage.clear(); this.router.navigateByUrl(''/login''); } }

y este es mi login.component.ts

"use strict"; import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from ''@angular/core''; import { FormBuilder, ControlGroup, Validators } from ''@angular/common''; import { MeteorComponent } from ''angular2-meteor''; import { Router } from ''@angular/router-deprecated''; import { Logger } from "../services/logger.service"; @Component({ selector: ''login'', templateUrl: ''client/login/login.html'', changeDetection: ChangeDetectionStrategy.OnPush, bindings: [Logger] }) export class LoginComponent extends MeteorComponent { loginForm:ControlGroup; loginFailed = false; constructor(private _logger:Logger, private _router:Router, private ref:ChangeDetectorRef) { super(); let fb = new FormBuilder(); this.loginForm = fb.group({ username: ["", Validators.required], password: ["", Validators.required] }); } login() { this.call(''authenticateUser'', this.loginForm.value.username, this.loginForm.value.password, (err, data) => { if (err) { this._logger.error(err); } else { this._logger.info(''[Authentication API] '', data); if (data.status != ''LOGIN_SUCCESS'') { this.loginFailed = true; } else { this.loginFailed = false ; var user = { id: data.id, name: data.name, role: data.role } localStorage.setItem(''user'', JSON.stringify(user)); this._router.navigate([''Home'']) } //This is required for letting Angular know that something has changed. //Because this part of code runs out of Angular zone. this.ref.markForCheck(); // Mark this component and its children for change detection in next detecting cycle. this.ref.detectChanges(); // Trigger change detection. } }); } }


Bueno, estas respuestas no me ayudaron. Encontré otra solución.

El componente secundario tiene una salida que se dispara cuando se hace clic en el botón Cerrar

<child-component *ngIf="childComponentIsShown" (formCloseEmitter)="hideChildComponent()" ></child-component>

Y el método "hideChildComponent ()" en el componente principal detecta los cambios.

hideChildComponent() { this.childComponentIsShown = false; this.cdr.detectChanges(); }

Espero que esto ayude a alguien.


Debe obtener el valor del suscriptor en una variable y darse de baja por la misma var. Por favor, consulte el mismo código

import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef, OnDestroy } from ''@angular/core''; import { Observable } from ''rxjs/Observable''; import ''rxjs/add/observable/of''; import { Cartservice } from ''./../cartservice.service''; import { ISubscription } from ''rxjs/Subscription''; export class CartComponent implements OnInit, OnDestroy { private subscription: ISubscription; ngOnInit() { this.subscription = this.cartservice.productsObservable.subscribe(cart => { this.cartProducts = cart.products; this.cartTotal = cart.cartTotal; this.changeDetectorRef.detectChanges(); }); } ngOnDestroy() { this.subscription.unsubscribe(); } }

Tenga en cuenta que he cancelado la suscripción de cambios en el método ngOnDestroy ().


En mi caso, fue una cuestión de mala administración de la configuración de prueba asíncrona de la configuración y compilación de componentes.

  1. El código anómalo tenía una asíncrona singular antes de cada () usando TypeScript Async / Await
  2. Para que funcione, estoy usando dos beforeEach () s, donde el primero maneja Async usando Angular''s async () , y el segundo beforeEach () es sync .

Código que causa errores.

beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ BrowserAnimationsModule ], providers: [ { provide: ComponentFixtureAutoDetect, useValue: true }, { provide: OptionsService, useValue: optionServiceMock }, ], declarations: [EventLogFilterComponent], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); fixture = TestBed.createComponent(EventLogFilterComponent); component = fixture.componentInstance; optionsService = TestBed.get(OptionsService); component.filterElem = jasmine.createSpyObj(''filterElem'', [''close'']); fixture.detectChanges(); });

Fue arreglado con ...

beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ BrowserAnimationsModule ], providers: [ { provide: ComponentFixtureAutoDetect, useValue: true }, { provide: OptionsService, useValue: optionServiceMock }, ], declarations: [EventLogFilterComponent], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(EventLogFilterComponent); component = fixture.componentInstance; optionsService = TestBed.get(OptionsService); component.filterElem = jasmine.createSpyObj(''filterElem'', [''close'']); fixture.detectChanges(); });


La única solución que funcionó para mí fue:

if (!this.changeDetectionRef[''destroyed'']) { this.changeDetectionRef.detectChanges(); }


Lo tengo resuelto con:

if (!(<ViewRef>this.cd).destroyed) { this.cd.detectChanges(); }


Mi causa sucedió cuando intentaba abrir un diálogo modal con NgbActiveModal. Aparentemente, llamar a .dismiss() desde su propio ngOnInit() causa esto.

export class MyModal { constructor(private modalInstance: NgbActiveModal) { } ngOnInit() { if (foo) this.modalInstance.dismiss(); }

La solución fue esperar un momento antes del despido.

if (foo) setTimeout(() => this.modalInstance.dismiss());


Mi solución fue cancelar la suscripción de todos los observadores.

Suscripción:

ngOnInit() { this._currentUserSubscription = this._auth.currentUser.subscribe(currentUser => {}); }

Darse de baja con changeDetector.detach ():

ngOnDestroy() { this._currentUserSubscription.unsubscribe(); this._cdRef.detach(); }

Eso era necesario en mi código, también debo usar la funcionalidad ChangeDetectorRef, solo esas dos cosas son mi código sin errores.


No está muy relacionado con una pregunta específica, pero llegué aquí buscando en Google el mismo error, así que compartiré mi solución. El problema era que estaba llamando a fixture.detectChanges() dentro de fixture.whenStable().then(() => {}) sin ajustar la prueba dentro de una función async .

Antes de:

it(''should...'', () => { fixture.whenStable().then(() => { fixture.detectChanges(); }); });

Después:

it(''should...'', async(() => { fixture.whenStable().then(() => { fixture.detectChanges(); }); }));


Para evitar este error, en lugar de llamar a detectChanges () intente ajustar el código de cambio de modelo de la siguiente manera:

this.ngZone.run(() => { ... });


Para mí, la única solución que funcionó es la siguiente:

ngOnInit() { if (this.destroyedComponent) this.changeDetector.reattach(); this.destroyedComponent = false; this.subscription = this.reactive.channel$.subscribe(msg => { switch (msg) { case "config:new_data": if (!this.destroyedComponent) { this.table.initTable(); this.changeDetector.detectChanges(); } } }) } ngOnDestroy() { this.subscription = null; this.destroyedComponent = true; this.changeDetector.detach(); }

Explicación:

  1. Si el componente ha sido destruido previamente, vuelva a colocar el detector.
  2. Establezca esa bandera anterior en un valor falso.
  3. Guarde la suscripción a RxJs y configure la lógica deseada en su interior.
  4. Envuelva esa lógica en un condicional que verifique si el componente ha sido configurado como destruido o no por el indicador previamente declarado.
  5. Realice la detección deseada de los cambios dentro de ese bloque.
  6. Establezca el método ngOnDestroy () y anule la suscripción, establezca el indicador destruidoComponente en un valor verdadero y separe el changeDetector.

Puedes usar

this.cdref.markForCheck();

en lugar de this.cdref.detectChanges(); en muchos casos. Pero el mejor enfoque es seguir los consejos de @ Al-Mothafar


Resolví el mismo problema tuyo, pero con un código mucho más pequeño, te diré el punto que podría ayudarte a resolver el problema.

El problema claramente proviene de detectChanges() porque se realizaron los cambios y se llamó al método durante la fase de destrucción del componente.

Por lo tanto, debe hacer que su componente implements OnDestroy , luego debe cancelar los cambios que hacen que se this.ref.detectChanges() . entonces su TopNavbarComponent debe ser similar a:

export class TopNavbarComponent implements OnDestroy { // ... your code ngOnDestroy() { this.cdRef.detach(); // do this // for me I was detect changes inside "subscribe" so was enough for me to just unsubscribe; // this.authObserver.unsubscribe(); } }

PD: ¡No olvides unsubscribe() todos los observadores que tienes en tu componente! De todos modos, tiene que hacer eso, las suscripciones sin darse de baja podrían ser la razón principal de cientos de problemas, incluido esto, consulte Angular / RxJs. ¿Cuándo debo darme de baja de `Subscription`?

Editar : conozco otra solución en la web que intenta resolver el problema manejando el error en sí mismo, mientras que la mejor práctica es conocer la raíz del problema, verificar si la vista destruida o no es una buena solución, pero la causa original podría ser un problema detrás de la pérdida de memoria, por lo que la raíz del problema es que el servicio en ejecución debe eliminarse NO solo intenta eliminar el error en sí mismo sin la raíz, por ejemplo, las suscripciones en ejecución (especialmente la personalizada) deben cerrarse.

Así que las cosas de limpieza son necesarias para un mejor rendimiento, no siempre es una solución más fácil y rápida, es mejor, si escondes la suciedad debajo de las alfombras no significa que hayas limpiado tu habitación :)


Sencillo:

import { OnDestroy } from ''@angular/core''; import { Subject } from ''rxjs/Subject''; export class Component implements OnDestroy { componentDestroyed: Subject<boolean> = new Subject(); constructor() { } function() { this.service.serviceFunction .takeUntil(this.componentDestroyed) .subscribe((incomingObservable: Type) => { this.variable = incomingObservable; }); } ngOnDestroy() { this._cdRef.detach(); //If you use change dectector this.componentDestroyed.next(true); this.componentDestroyed.complete(); }


Simplemente desconecte ChangeDetectorRef en el gancho del ciclo de vida de OnDestroy y verifique si ChangeDetectorRef se destruyó antes de ejecutar el método detectChanges

constructor(private cd: ChangeDetectorRef){} someFunction(){ if(!this.cd[''destroyed'']){ this.cd.detectChanges(); } } ngOnDestroy(){ this.cd.detach(); }