2016-06-21 2 views
1

Я эту проблему, когда я нажимаю на кнопку входа, журнал хром консоли этого:AngularJS «Не удается прочитать свойство„затем“неопределенной»

angular.min.js:117 TypeError: Cannot read property 'then' of undefined at m.$scope.logIn (loginModuleController.js:11)

Услуги:

angular.module('loginModule') 
.factory('loginService', function($http){ 
    return{ 
    login: function(username, password){ 
     var session; 
     $http.post('../server/php/auth/auth.php', { 
     username: username, 
     password: password 
     }) 
     .then(function(res){ 
     session = res; 
     }); 
     return session; 
    }, 
    isLogged: function(){ 
     return $http.get('../angCMS/server/php/auth.php?is_logged=true'); 
    }, 
    logOut: function(){ 
     return $http.get('../angCMS/server/php/auth.php?logout=true'); 
    } 
    }; 
}); 

контроллер :

angular.module('loginModule') 
.controller('LoginCtrl', ['$scope', 'loginService', function($scope, loginService){ 

    $scope.auth = false; 

    $scope.username; 
    $scope.password; 
    $scope.logIn = function(){ 
    loginService.login($scope.username, $scope.password).then(function(response){ 

    }, function(res){ 

    }); 
    }; 

    $scope.isLogged = function(){ 
    loginService.isLogged() 
    .then(function(response){ 
     if(response){ 
     $scope.auth = true; 
     } 
    }); 
    }; 

    $scope.logOut = function(){ 
    loginService.logOut() 
    .then(function(response){ 
     if(response){ 
     $scope.auth = false; 
     } 
    }); 
    }; 

}]); 

и это шаблон HTML:

<div class="container" ng-if="auth==false"> 
    <div class="col-md-4 col-md-offset-4"> 
    <div class="row"> 
     <br/><h2 align="center">Login</h2> 
    </div> 
    <div class="well"> 
     <form class="form-horizontal"> 
     <fieldset> 
      <div class="form-group"> 
       <input type="text" class="form-control" placeholder="Username" ng-model="username" required> 
      </div> 
      <div class="form-group"> 
       <input type="password" class="form-control" placeholder="Password" ng-model="password" required> 
      </div> 
      <div class="form-group"> 
       <button class="btn btn-md btn-primary btn-block" type="submit" ng-click="logIn()">Sign in</button> 
      </div> 
     </fieldset> 
     </div> 
    </form> 
    </div> 
</div> 

PHP метод Логин:

public function login($user, $pass){ 

     $user = htmlspecialchars(trim($user)); 
     $pass = md5(htmlspecialchars(trim($pass))); 

     $res = $this->DB->prepare("SELECT * FROM `admin` WHERE username = :user"); 
     if(!$res->execute(Array(":user"=>$user))) 
      die(mysql_error()); 

     $row = $res->fetch(PDO::FETCH_ASSOC); 

     if(!$row['password'] == $pass) 
      die("Errore: password errata!"); 

     $_SESSION['logged'] = $row; 
     array_push($session, $_SESSION['logged'], true); 

     return $session; 
    } 

ответ

3

Это скорее неправильное использование обещаний.

Вы можете сначала посмотрим, как работают обещания:

Из кода сервиса:

login: function(username, password){ 
    var session; 
    $http.post('../server/php/auth/auth.php', { 
    username: username, 
    password: password 
    }) 
    .then(function(res){ 
    session = res; 
    }); 
    return session; 
} 

Когда login(username, password) вызывается, сеанс по-прежнему undefined после возвращения.

Это потому, что $http.post() является асинхронной функцией, предложение .then() не выполняется немедленно.

Как отметил Snixtor's answer, вы должны "вернуть возвращаемое значение $http.post()":

login: function(username, password){ 
    return $http.post('../server/php/auth/auth.php', { 
    username: username, 
    password: password 
    }); 
} 

Затем со ссылкой на метод Войти вашего контроллера:

$scope.logIn = function(){ 
    loginService.login($scope.username, $scope.password).then(function(response){ 
    // response === 'session' 
    }, function(res){ 

    }); 
}; 

параметр response из loginService.login().then() является точно значение вашей предполагаемой переменной session из вашей предыдущей реализации.

2

Вы возвращаете неприсвоенное переменную с именем "сессии". Итак, то, что вы делаете здесь, в вашем зарегистрированном методе возвращается неопределенным. Undefined не имеет метода, называемого then.

login: function(username, password){ 
     var session; 
     $http.post('../server/php/auth/auth.php', { 
     username: username, 
     password: password 
     }) 
     .then(function(res){ 
     session = res; 
     }); 
     return session; 
    }, 

Я предполагаю, что вы действительно хотите вернуть метод $ http.post, который, в свою очередь, возвращает обещание. Таким образом, вы можете использовать сеанс в контроллере?

+0

Я только что добавил метод входа php – faserx

+0

php не имеет значения. –

2

Ваша служебная функция login не может вернуть обещание, созданное по вызову $http.post. Вместо этого вам нужно это:

login: function(username, password){ 
    return $http.post('../server/php/auth/auth.php', { 
    username: username, 
    password: password 
    }); 
} 

Примечание также, что я удалил session переменную из функции. Это функция then в вашем контроллере, которая должна иметь дело с ответом.

Ваши isLogged и logOut функции выглядят хорошо уже. Просто повторите эту схему.

+0

Я просто добавил метод входа php – faserx

+0

Проблема не имеет ничего общего с методом php. Вы понимаете, что я сказал в ответ? – Snixtor

+0

Я понял это, я поставил php, чтобы вы могли видеть, что я хочу вернуться из метода – faserx

Смежные вопросы