2017-11-14 1 views
0

In meiner Anwendung habe ich Probleme mit angular nicht bindende Eigenschaften. Es ruft auch ngOnInit und ngAfterViewInit nicht auf oder führt Anweisungen aus.
ist hier teilweise LoginComponent Code:Angular führt Bindings, Direktive und ngOnInit nicht aus, wenn Route geändert wird

@Component({ 
    templateUrl: './login.component.html', 
    styleUrls: ['./login.component.scss'] 
}) 
export class LoginComponent implements OnInit 

//..... 

    public test: string = 'some dummy test'; 

    constructor(
     private cd: ChangeDetectorRef, 
     private fb: FormBuilder, private router: Router, private route: ActivatedRoute, 
     private authService: AuthService, 
     private usersService: UserService, 
     private notificationsService: NotificationsService 
    ) 
    { 
     this.loginForm = fb.group({ 
      email: ["", Validators.required], 
      password: ["", Validators.required] 
     }); 
     console.info("constructor"); 
    } 

    ngOnInit() 
    { 
     console.info("ngOnInit"); 
     this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';   
    } 

    ngAfterViewInit() 
    { 
     this.initGapi(); 
     console.info("afterviewinit"); 
    } 

Seltsam ist, dass dies funktioniert, wenn ich Seite zu öffnen, oder HMR Seite aktualisieren, aber nicht, wenn ich Anmelde- und Abmelde.
ist die Logout-Code:

logout(): boolean 
{ 
    this.authService.logout(); 
} 

//authservice.ts 
logout() 
{  
    localStorage.removeItem("token"); 
    localStorage.removeItem("refresh_token"); 
    localStorage.removeItem("profile"); 

    if (gapi.auth2) 
    { 
     const instance = gapi.auth2.getAuthInstance(); 
     if (instance) 
     { 
      instance.signOut().then(() => 
      { 
       this.router.navigate(["login"]); 
      }); 
      return; 
     } 
    } 
    this.router.navigate(["login"]); 
} 

Die Unterschiede, wenn ich abmelden und Bindung sind nicht auftreten:

  • Knopf nicht gestylt. Dies sollte fehlt

  • Bindung kendoButton Richtlinie <button class="center" kendoButton type="submit">

  • zu Test (einige Dummy-Test) tun

  • ngOnInit und ngAfterViewInit wird nicht aufgerufen.

Es gibt keinen Fehler in der Konsole. Ich nehme auch Bildschirm auf (es beginnt mit einer leeren Seite). Ich habe die neuesten Chrome und Firefox, und das gleiche Problem ist in beiden Browsern.

Hat jemand eine Idee was falsch ist oder was kann ich sonst noch versuchen?

screen recording

+0

explizit ausführen Wohin leitet Ihre Login-Logik Benutzer? –

+0

Wahrscheinlich verwandt https://StackOverflow.com/a/47268066/3731501, aber ich bin mir nicht sicher, was in Ihren Router Outlets vor sich geht. – estus

+0

Danel: Es leitet von localhost: 50222/home zu localhost: 50222/login. estus: Ich sehe nicht, wie dies mit der von Ihnen gestellten Frage zusammenhängen könnte. – Makla

Antwort

2

Wenn gapi außerhalb der Angulars-Zone ausgeführt wird, wird die Änderungserkennung nicht zur Ausführung weitergeleitet. Sie können Code innerhalb Angulars Zone wie

constructor(private zone:NgZone) {} 

...  

    this.zone.run(() => { 
    this.router.navigate(["login"]) 
    }); 
+0

Ich verstehe, dass ich bereits meine eigene Frage beantworte.Ich finde es seltsam, dass es nicht funktioniert. Der Router ändert die Route, eine neue Seite wird angezeigt. Geschieht das alles außerhalb von Angular? – Makla

+1

Wenn 'instance.signOut(). Then (() => ...)' '' 'außerhalb der angulars-Zone aufruft, läuft alles, was von dieser aufgerufen wird, außerhalb der Angulars-Zone. Der Router, der die Komponente hinzufügt, befindet sich außerhalb der Angulars-Zone, daher gibt es keine Änderungserkennung für die neue Komponente und ihre untergeordneten Elemente. Nichts wird dort passieren, bis die Änderungserkennung durch andere Mittel verursacht wird. –

+0

Sie haben 'zone' nicht in Ihrer Antwort verwendet, aber dies sollte hier verwendet werden. 'ChangeDetectorRef.detectChanges() 'funktioniert nur für die lokale Komponente und ihre untergeordneten Elemente. –

0

Problem ist in Google gapi Bibliothek:

const instance = gapi.auth2.getAuthInstance(); 
if (instance) 
{ 
    instance.signOut().then(() => 
    { 
     this.router.navigate(["login"]); //This is runned outside Angular's context. 
    }); 
    return; 
} 

Rückruf von instance.signOut läuft außerhalb Angular Kontext. Lösung außerhalb google.gapi Rückruf zu platzieren navigieren:

const instance = gapi.auth2.getAuthInstance(); 
if (instance) 
{ 
    instance.signOut(); 
    this.router.navigate(["login"]); 
} 

Oder wenn Sie nach SignOut von Google navigieren möchten, verwenden Sie Zonen. This kann helfen.

Verwandte Themen