2017-02-17 11 views
0

Мой код работал нормально. Я добавил некоторые новые функции для входа, и он сломал его. Поэтому я удалил код. Это исходный формат, но ошибка все еще остается, Создание функции пользовательского обслуживания не является функцией. Я прочитал много вопросов по этой теме, но ни один из ответов не помог.ТипError: Users.create не является функцией

UserController

todoApp.controller('UserController', ['Users','$scope', function UserController(Users, $scope) { 
    console.log("in user controller"); 

    $scope.formModel = {}; 
    $scope.submitting = false; 
    $scope.submitted = false; 
    $scope.has_error = false; 

    console.log($scope.formModel); 
    $scope.createUser = function() { 
     if(!$scope.registerForm.$valid) { 
      return; 
     } 
     Users.create($scope.formModel) 
     .success(function(data){ 

      $scope.submitting = false; 
      $scope.submitted = true; 
      $scope.has_error = false; 
      $scope.formModel = {}; // clear the form so our user is ready to enter another 
      $scope.users.push(data); 
      console.log(":)"); 
     }).error(function(data) { 
      console.log(":("); 
      $scope.submitting = false; 
      $scope.submitted = false; 
      $scope.has_error = true; 
     }); 


    }; 

}]); 

user.sevice.js

todoApp.factory('Users', ['$http', function($http) { 
    return { 
     get: function() { 
      return $http.get('/api/users'); 
     }, 

     create: function(userData) { 
      console.log(userData); 
      return $http.post('/api/users', userData); 
     }, 

     delete: function(id) { 
      return $http.delete('/api/users/' + id); 
     }, 

     update: function(userData) { 
      return $http.put('/api/users/' + userData.id, userData); 
      console.log(userData); 
     } 
    } 
}]); 

register.html

<div class="container"> 

    <div class="row main" ng-controller="UserController"> 
     <div class="main-login main-center"> 
     <h5>Sign up once for instant access.</h5> 
      <form name="registerForm" ng-submit="createUser()" 
       novalidate="novalidate" 
       ng-hide="submitted" > 

       <div class="form-group"> 
        <label for="name" class="cols-sm-2 control-label">Your Name</label> 
        <div class="cols-sm-10"> 
         <div class="input-group"> 
          <span class="input-group-addon"><i class="fa fa-user fa" aria-hidden="true"></i></span> 
          <input type="text" 
           class="form-control" 
           ng-model="formModel.name" 
           id="name" 
           placeholder="Enter your Name" 
           required="required" /> 
         </div> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label for="email" class="cols-sm-2 control-label">Your Email</label> 
        <div class="cols-sm-10"> 
         <div class="input-group"> 
          <span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span> 
          <input type="email" 
           class="form-control" 
           ng-model="formModel.email" 
           id="email" 
           placeholder="Enter your Email" 
           required="required" /> 
         </div> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label for="username" class="cols-sm-2 control-label">Username</label> 
        <div class="cols-sm-10"> 
         <div class="input-group"> 
          <span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i></span> 
          <input type="text" 
           class="form-control" 
           ng-model="formModel.username" 
           id="username" 
           placeholder="Enter your Username" 
           required="required" /> 
         </div> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label for="password" class="cols-sm-2 control-label">Password</label> 
        <div class="cols-sm-10"> 
         <div class="input-group"> 
          <span class="input-group-addon"><i class="fa fa-id-badge" aria-hidden="true"></i></span> 
          <input type="password" 
           class="form-control" 
           ng-model="formModel.password" 
           id="password" 
           placeholder="Enter your Password" 
           required="required" /> 
         </div> 
        </div> 
       </div> 

        <label for="confirm" class="cols-sm-2 control-label">Confirm Password</label> 
        <div class="cols-sm-10"> 
         <div class="input-group"> 
          <span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span> 
          <input type="password" 
          class="form-control" 
          name="confirm" 
          id="confirm" 
          placeholder="Confirm your Password" 
          required="required" /> 
         </div> 
        </div> 
       </div> 

       <div class="form-group" > 
        <label for="type" class="cols-sm-2 control-label">User Type</label > 
        <div class="cols-sm-10"> 
         <span class="input-group-addon"><i class="fa fa-university" aria-hidden="true"></i></span> 
         <select id="type" 
             class="form-control" 
             ng-model="formModel.role" 
             required="required" > 
          <option value="" >Please Choose</option > 
          <option value="1" >Lecturer</option > 
          <option value="2" >Student</option > 
         </select > 
        </div> 
       </div > 
       <div> 
        <button class="btn btn-primary" 
          ladda="submitting" 
          data-style="expand-right" 
           type="submit"> 
         <span ng-show="submitting">Registering</span> 
         <span ng-show="!submitting">Register</span> 
        </button> 
       </div>   
      </form> 
     </div> 
    </div> 
</div> 

ответ

1

Вы должны вернуть обратный вызов со значением, а не возвращать HTTP сырое обещание от сервера. Попробуйте

Услуги

create: function(userData, callback) { 
     $http.post('/api/users', userData).then(function (res) { 
      return callback(res.data); 
     }, 'error') 
}, 

Контроллер

// Успех рекомендуется для Угловое 1,5>

// Success код возврата от сервера (Это не истинная ошибка код нравится 404 и 500. Это всего лишь код, который вы дали на сервере) - пусть говорят, что сервер возвращает json-формат для успеха - {code: '0000, примечание: «Успех»} и err или - {code: '9999', примечание: «Успех»}. Это зависит от вашего сервера. Это то, что я делаю в своем предыдущем проекте

$scope.createUser = function() { 
    if(!$scope.registerForm.$valid) { 
     return; 
    } 
    Users.create($scope.formModel, function (res) { 
     switch (res.code) { 
      case '0000': 
       $scope.submitting = false; 
       $scope.submitted = true; 
       $scope.has_error = false; 
       $scope.formModel = {}; // clear the form so our user is ready to enter another 
       $scope.users.push(data); 
     console.log(":)"); 
       break; 
      case '9999': 
       console.log(":("); 
       $scope.submitting = false; 
       $scope.submitted = false; 
       $scope.has_error = true; 
       console.log('error'); 
       break; 
     } 
    }); 
}; 

Скажем, ваш сервер не возвращает код ошибки и только данные. Вы можете сделать это так:

$scope.createUser = function() { 
    if(!$scope.registerForm.$valid) { 
     return; 
    } 
    Users.create($scope.formModel, function (res) { 
     if (res !== undefined) {   
       $scope.submitting = false; 
       $scope.submitted = true; 
       $scope.has_error = false; 
       $scope.formModel = {}; // clear the form so our user is ready to enter another 
       $scope.users.push(data); 
     } else { 
       console.log(":("); 
       $scope.submitting = false; 
       $scope.submitted = false; 
       $scope.has_error = true; 
       console.log('error'); 
     } 
     } 
    }); 
+0

Это сработало. Извините, что не отвечал до сих пор, но я был вдали от компьютера, так как я задал вопрос. В другом случае, если случай «xxxx» заполняется номерами ответов HTTP, например, 403 или 200 для успеха? –

+0

Это дело для успеха, в другом слове только для ответа HTTP 200. Вы можете уловить еще один код ошибки http в 'error' перед закрытием http post. – digit

+0

Я немного смущен относительно того, что делают дела «0000» и «9999». Означает ли это, что он ловит любой ответ HTTP более чем 0000 и менее 9999? –

0

если выше обеспечивают d правильно, тогда в коде нет проблем. у вас могут отсутствовать ссылки. Проверьте мой плукер. Ваш код делает звонки до api.

Console окно моего шлепнуть

in user controller 
VM413 app.js:11 Object {}__proto__: Object 
VM413 app.js:13 create called!! 
VM413 app.js:45 create method on factory called!! 
VM413 app.js:46 Object {name: "Kalyan", email: "[email protected]", username: "tee", password: "tet", role: "1"} 
VM411 angular.min.js:105 POST https://run.plnkr.co/api/users 400() 

Click here to see my plunk

+0

, который с уверенностью работал в вашем плункер. Какие ссылки также будут ссылаться. –