1

我在用户模型中有布尔字段,我需要在用户按下提交后立即在登录页面上打开一个模态窗口,并在我检查 user.user_on_test 字段后从服务器获取信息并仅在它为真时打开模态窗口。你能帮我从回复中提取这些信息吗?

这是我的 user.service

    @Injectable()
    export class UserService extends BaseService {
      protected API_PATH: string;

      constructor( protected _http: HttpClient ) {
       super( _http );
       this.API_PATH += '/rest-auth';
       this.getUserData().subscribe();
      }

      private _user: BehaviorSubject<User> = new BehaviorSubject( null );

      get user(): Observable<User> {
        return this._user.asObservable();
      }

      set user( user ) {
       if ( <User>user ) {
        this._user.next( new User( user ) );
        localStorage.setItem( 'active', ( <User>user)
          .is_active.toString() );
        localStorage.setItem( 'superuser', ( <User>user)
          .is_superuser.toString() );
        localStorage.setItem( 'user_on_test', ( <User>user)
          .user_on_test.toString() );
        } else {
        this._user.next( null );
          localStorage.removeItem( 'active' );
          localStorage.removeItem( 'superuser' );
          localStorage.removeItem( 'user_on_test');
         }
       }

     public login( user: User ): Observable<any> {
      return Observable.concat(
       this.request( {
        'method': 'POST',
        'url': '/login/',
        'body': {
          username: user.username,
          password: user.password
        }
       } ),
       this.getUserData()
      );
     }

和 login.component:

    login() {
      this.errorMsg = '';
      this._authService.login( this.user )
        .takeUntil( this.destroy$).subscribe(
        (response) => {
        if (this._authService.user) {
        // here I need to check user.user_on_test
          alert('this user is on test server!');
        }
        if ( this.redirect ) {
          const url = this._route.snapshot.queryParams['returnUrl'] ||'/';
          this._router.navigate( [ url ] );
        }
      },
      ( rejection ) => {
        if ( rejection && rejection.hasOwnProperty( 'error' ) && 
       rejection.error.non_field_errors ) {
          for (const error in rejection.error.non_field_errors) {
            if (rejection.error.non_field_errors.hasOwnProperty(error)) {
              this.errorMsg = rejection.error.non_field_errors[error];
            }
          }
        }
      });
      }
4

2 回答 2

1

很难说public login(user: User)返回类型为Observable<any>.

假设 API 调用返回 a User,这将使方法返回类型Observable<User>,代码应如下所示:

this._authService.login(this.user)
    .takeUntil(this.destroy$)
    .subscribe(
    (response: User) => {
        if(response.user_on_test) {
             // open the modal
        }
    },
    {
        ...
    });
于 2018-03-27T11:49:28.890 回答
0

没有“getUserData”的代码很难说,也没有登录请求的响应示例。

我现在的猜测是你可以做这样的事情:

const user = this._authService.user;

if (user && user.user_on_test) {
  alert('this user is on test server!');
}

希望有帮助

于 2018-03-27T11:51:22.743 回答