如何将错误firebase消息从服务发送到控制器?

时间:2016-03-25 13:15:20

标签: angularjs firebase angularfire firebase-authentication

我使用Angular js和firebase。 对于我的登录表单和我的注册表单,我有一个控制器" userController"谁在我的服务userProvider中调用函数。

我想在我的视图中显示firebase错误消息。我的提供商如何向我的控制器发送消息?

我的代码:

userController.js:

$scope.login = function(user){
            userProvider.login(user);
 }

userProvider.js:

this.login = function(user){
    Auth.$authWithPassword({//on connecte l'utilisateur
      email: user.email,
      password: user.password
    }).then(function(authData) {
        console.log("Utilisateur connecté:", authData.uid);
        $location.path('#/profil');
    }).catch(function(error) {
        console.error("Echec connexion:", error);
        // I want return the error.code for use it in my controller
    });
 }

login.html:

<form ng-hide="authData" class="form-signin col-md-6" name="loginForm" novalidate >
<h2 class="form-signin-heading">Connexion</h2>
<p style="color:red;" ng-show="userDataError">{{userDataErrorMessage}}</p>

<div class="form-group" ng-class="{ 'has-error' : loginForm.email.$invalid }">
    <label for="inputEmail">Email</label>
    <input type="email"  class="form-control" placeholder="Email address" ng-model="user.email" name="email" ng-required autofocus>
    <p class="help-block text-error" ng-show="loginForm.email.$invalid">Cet email n'est pas valide</p>
</div>
<div class="form-group" ng-class="{ 'has-error' : loginForm.password.$invalid }">
    <label for="inputPassword">Password</label>
    <input type="password" class="form-control" placeholder="Password"  ng-model="user.password" ng-minlength="8" name="password" ng-required>
    <p class="help-block text-warning" ng-show="loginForm.password.$error.minlength" >Minimum 8 caractères</p>
</div>
<button  class="btn btn-lg btn-primary btn-block" ng-disabled="loginForm.$invalid" ng-click="login(user)">Connexion</button>

2 个答案:

答案 0 :(得分:0)

首先,对于这些类型的计划,我绝对不会使用提供程序而是服务......所以你可以做些什么来实现向控制器显示错误的问题:

在loginService.js

app.service('loginService', ["$scope", "Auth", "$firebaseAuth", function($scope,Auth,$firebaseAuth){
  var vm= this;
  this.login = function(user){
    Auth.$authWithPassword({//on connecte l'utilisateur
      email: user.email,
      password: user.password
    })
 }
}])

并在Ctrl:

app.controller('MainCtrl', function($scope){
loginService.login().then(function(authData) {
        console.log("Utilisateur connecté:", authData.uid);
        $scope.userData = authData.uid;
        $location.path('#/profil');
    }).catch(function(error) {
        console.error("Echec connexion:", error);
         $scope.errorLogin = error;
        // I want return the error.code for use it in my controller
        $scope.loginError = error;
    });;

})

答案 1 :(得分:0)

从函数中返回派生的承诺。

this.login = function(user){
    //return promise
    return derivedPromise = (
        Auth.$authWithPassword({//on connecte l'utilisateur
          email: user.email,
          password: user.password
        }).then(function(authData) {
            console.log("Utilisateur connecté:", authData.uid);
            $location.path('#/profil');
        }).catch(function(error) {
            console.error("Echec connexion:", error);
            //throw error to chain
            throw error;
        });
    );
});

在控制器中,使用promise显示错误。

$scope.login = function(user){
     userProvider.login(user)
         .catch( function onRejected(error) {
              $scope.errorMessage = ("Echec connexion:" + error);
         });
};

通过返回承诺,可以使用承诺的.then.catch方法检索结果(已完成或已拒绝)。