【问题标题】:Angular 2 object unsubscribed errorAngular 2对象取消订阅错误
【发布时间】:2016-10-13 07:47:10
【问题描述】:

我正在开发使用 Angular 2 进行测试的小项目,但在登录时出现对象未订阅错误。

这是我的登录组件:

import {Component, OnDestroy} from '@angular/core';
import {Router} from '@angular/router';
import { Subscription } from 'rxjs/Subscription';
import {Location} from '@angular/common';


import {AuthService} from './services/auth.service';
import {RoutingService} from './services/routing.service';

import {ToastyService, ToastyConfig, ToastOptions, ToastData} from 'ng2-toasty';

import {LoadingBarModule, LoadingBarService} from 'ng2-loading-bar';


@Component({
    selector: 'login',
    template: `
                <loading-bar color="#FF0000" [height]="3" [animationTime]="0.3" [runInterval]="100" [progress]="0"></loading-bar>
                <h3> {{'LOGIN' | translate }} </h3>
                <p> {{Message}} </p>

                <div *ngIf="!authService.isLoggedIn">
                    <input [(ngModel)]="username" placeholder="{{'USERNAME' | translate}}" /><br />
                    <input type="password" [(ngModel)]="password" placeholder="{{'PASSWORD' | translate}}" />
                </div>
                <div>
                    <button (click)="login()" *ngIf="!authService.isLoggedIn">{{'LOGIN' | translate }}</button>
                </div>

                <label class="label label-danger">{{errorMessage}}</label>

                <ng2-toasty [position]="'top-center'"></ng2-toasty>
              `
})

export class LoginComponent implements OnDestroy {
    username: string;
    password: string;
    subscription: Subscription;

    constructor(private authService: AuthService, private router: Router, private toastyService: ToastyService, private toastyConfig: ToastyConfig, private loadingBarService: LoadingBarService, private routingService: RoutingService, private location:Location) {
        this.toastyConfig.theme = 'material';
    }

    login() {

        this.loadingBarService.start();

        this.subscription = this.authService.login(this.username, this.password).subscribe(() => {

            if (this.authService.isLoggedIn) {
                this.toastyService.default('Hi');

                this.routingService.logged = false;

                let redirect = this.authService.redirectUrl ? this.authService.redirectUrl : this.routingService.lang + '/apphomecomponent';

                this.router.navigate([redirect]);
            }
            else {
                this.toastyService.default('Login failed');
            }
        });
    }

    ngOnDestroy() {
        this.subscription.unsubscribe();
    }
}

这是我的 AuthService:

import {Injectable} from '@angular/core';

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/delay';



@Injectable()
export class AuthService {
    isLoggedIn: boolean = false;

    redirectUrl: string;

    login(username: string, password: string): Observable<boolean> {
        if (username === 'test' && password === 'test') {
            return Observable.of(true).delay(1000).do(val => this.isLoggedIn = true);
        }
        else {
            return Observable.of(false).delay(1000).do(val => this.isLoggedIn = false);
        }
    }

    logout(): void {
        this.isLoggedIn = false;
    }
}

当我第一次登录时,它工作正常。但是当我注销并尝试再次登录时,它给了我错误:

【问题讨论】:

  • 你能解决这个问题吗?

标签: angular


【解决方案1】:

我遇到了类似的问题,并通过将 *ngIf 替换为 [hidden] 来“解决”它。

此解决方案不会从 dom 中删除元素,这可能是导致退订问题的原因,它只是隐藏了元素。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2023-01-04
  • 2016-10-27
相关资源
最近更新 更多