Ionic 2与ngrx,AlertController,LoadController问题

时间:2017-02-13 15:33:45

标签: javascript angular ionic2 ngrx ngrx-effects

请原谅我的无知,我对反应性概念相当新。

我的问题是不知道如何根据商店当前状态处理装载Ionic 2装载机或Ionic 2警报。

我已经能够通过订阅它正在做出反应的商店切片来实现我需要的加载器行为。虽然当涉及警报(抛出捕获的错误)时,它永远不会在订阅块中触发。

任何指出更好方向的帮助,或者我错过的内容都将非常感激。

此代码来自登录模式视图。

signin(user) {
    this.submitAttempt = true;

    if (this.signinForm.valid) {
        let loader = this.loadingCtrl.create({
            content: "Signing In..."
        });

        let auth;
        let signinSub = this.store.select(s => auth = s.auth).subscribe(() => {
            if (auth.state) {
                loader.dismiss();
            } else if (auth.error) {
                let alert = this.alertCtrl.create({
                    title: "Error",
                    subTitle: auth.error,
                    buttons: ['OK']
                });
                loader.dismiss();
                alert.present();
            }
        });

        loader.present();
        this.store.dispatch(UserActions.UserActions.signinUser(user));
    }
}

效果

@Effect() signinUser$ = this.actions$
.ofType(UserActions.ActionTypes.SIGNIN_USER)
.map(toPayload)
.switchMap(user => {
    return Observable.fromPromise(this.userService.signinUser(user))
        .map(result => {
            return ({ type: "GET_USER", payload: user});
        })
        .catch(err => {
            return Observable.of({ type: "SIGNIN_USER_FAILED", payload: err });
        });
});

服务

signinUser(user): Promise<any> {
    return <Promise<any>>firebase.auth()
    .signInWithEmailAndPassword(user.email, user.password);
}

减速

export const UserReducer: ActionReducer<Auth> = (state: Auth = initialState, action: Action) => {
    switch(action.type) {
        case UserActions.ActionTypes.SIGNIN_USER:
            return state;
        case UserActions.ActionTypes.SIGNIN_USER_FAILED:
            return Object.assign(state, { apiState: "Failed", error: action.payload.message });
        case UserActions.ActionTypes.STARTED_SIGNIN:
            return Object.assign(state, { requested: true });
        case UserActions.ActionTypes.GET_USER:
            return Object.assign(state, { apiState: "Success", error: ""});
        case UserActions.ActionTypes.GET_USER_SUCCESS:
            return Object.assign({ user: action.payload.val() }, state, { state: true });
        default:
            return state;
    };
}

存储

export interface Auth {
    state: boolean,
    requested: boolean,
    apiState: string,
    error: {},
    user?: {}
}

export interface AppState {
    auth: Auth;
}

2 个答案:

答案 0 :(得分:1)

我在商店中只有一个loadingState,然后根据该状态加载和卸载微调器/加载UI。

我在这里有一个完整的项目,展示了我如何管理状态和UI

https://github.com/aaronksaunders/ngrx-simple-auth

$(document).ready(function(){
  var $parent = $('.fa-stack.fa-5x.has-badge');
  var $img = $('img.badge-img');
  if($parent.data('count') > 0 ) {
    $img.attr('src','image path for more than 0');
  } else {
    $img.attr('src','image path for less than 0');
  }
})

然后在不同的状态/** * Keeping Track of the AuthenticationState */ export interface AuthenticationState { inProgress: boolean; // are we taking some network action isLoggedIn: boolean; // is the user logged in or not tokenCheckComplete: boolean; // have we checked for a persisted user token user: Object; // current user | null error?: Object; // if an error occurred | null }

AuthActions.LOGIN

然后,case AuthActions.LOGIN: { return Object.assign({}, state, {inProgress: true, isLoggedIn: false, error: null}) }

AuthActions.LOGIN_SUCCESS

以下是我们如何在case AuthActions.LOGIN_SUCCESS: { return Object.assign({}, state, {inProgress: false, user: action.payload, isLoggedIn: true}) }

中处理它
LoginPage

我们如何处理

    var dispose = this.store.select('authReducer').subscribe(
      (currentState: AuthenticationState) => {
        console.log("auth store changed - ", currentState);
        if (currentState.user) {
          dispose.unsubscribe();
          this.nav.setRoot(HomePage, {});
        }

        // this is where the magic happens...
        this.handleProgressDialog(currentState);

        this.error = currentState.error
      },
      error => {
        console.log(error)
      }
    );

  }

答案 1 :(得分:0)

我也使用Ionic 2和ngrx,据我所知,LoadingControllerAlertController没有提供任何可观察或承诺。因此,我认为你能做的最好的事情就是你现在所做的就是订阅它的状态并根据它的状态做一些条件。

或者你可以摆脱LoadingController用ion-spinner替换它:

<ion-spinner [disabled]="isLoading$ | async"></ion-spinner>

用一些标签替换AlertController:

<span>{{errorMessage$ | async}}</span>