1

Я очень много нового в AngularJS и у меня есть следующая проблема:AngularJS: Как получить возвращаемое значение от фабрики

Вид:

<div> 
    <form role="form" name="loginForm" class="form-horizontal login-form"> 
     <div class="form-group"> 
      <p class="login-form-msg">Welcome : {{user.username}}</p> 
      <label for="inputUserName" class="col-sm-2 control-label login-form-label">Base</label> 
      <div class="col-sm-10"> 
       <input type="text" placeholder="Enter base" class="form-control" required ng-model="user.code"> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label for="inputUserName" class="col-sm-2 control-label login-form-label">Username</label> 
      <div class="col-sm-10"> 
       <input type="text" placeholder="Enter name" class="form-control" required ng-model="user.username"> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label for="inputPassword" class="col-sm-2 control-label login-form-label">Password</label> 
      <div class="col-sm-10"> 
       <input type="password" placeholder="Password" id="inputPassword" class="form-control" required ng-model="user.password"> 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-sm-offset-2 col-sm-10 login-form-button"> 
       <button class="btn btn-default" type="submit" ng-disabled="loginForm.$invalid" ng-click="login(user)">Sign in</button> 
      </div> 
      <p class="login-form-msg">{{msgtxt}}</p> 
     </div> 
    </form> 
</div> 

Основные ЯШ:

var myApp = angular.module('myApp', ['ngRoute']); 

myApp.config(['$routeProvider', function ($routeProvider) { 
    $routeProvider.when('/login', { 
     templateUrl: 'partials/login.html', 
     controller:'loginCtrl' 
    }); 
    $routeProvider.when('/welcome', { 
     templateUrl: 'partials/welcome.html', 
     controller:'loginCtrl' 
    }); 
    $routeProvider.otherwise({ redirectTo: '/login' }); 
}]); 

I имеют следующую фабрику:

myApp.factory('getURLService', function ($http, config) { 
    return { 
     getURL: function (user,scope) { 
      $http.get(config.backend + "/Device/GetURLbyCode", { 
       params: { code: user.code } 
      }) 
      .success(function (data) { 
       var url = ''; 
       if (data.status == 'succ') { 
        url = data.Result; 
       } 
       else { 
        scope.msgtxt = data.msg; 
       } 
       return url; 
      }); 
     } 
    } 
}); 

Мне нужно использовать возвращаемое значение с этого завода на других заводах.

К примеру, в моем входа завода:

myApp.factory('loginService', function ($http, $location, config) { 
    return { 
     login: function (user,url,scope) { 

      $http.get(url + "/Device/Register", { 
       params: { userName: user.username, password: user.password } 
      }) 
      .success(function (data) { 
       if (data.status == 'succ') { 
        $location.path('/welcome'); 
       } 
       else { 
        scope.msgtxt = data.msg; 
       } 
      }); 
     } 
    } 
}); 

Это мой контроллер:

myApp.controller('loginCtrl', function ($scope, getURLService, loginService) { 
    $scope.msgtxt = ''; 

    $scope.login = function (user) { 
     loginService.login(user,url,$scope); //call login service 
    } 
}); 

Что мне нужно делать в контроллере фактически возвращает URL, а затем отправить его в услугу входа в систему или любую другую услугу (или даже контроллер) в будущем?

Заранее благодарим за ваше время и предложение.

ответ

2

Для возврата данных из функции вы должны вернуть объект обещания, который $http.get уже возвращает его.

Дополнительная информация, о которой я хотел бы указать, заключается в передаче $ scope службе, не подчиняющейся правилу singleton, поскольку вы создаете службу, зависящую от области контроллера. Служба должна принимать только параметр и возвращать результат, обрабатывая его, и ничего больше.

Код

return { 
    getURL: function (user,scope) { 
     return $http.get(config.backend + "/Device/GetURLbyCode", { 
      params: { code: user.code } 
     }) 
     .then(function (res) { 
      var data = res.data; 
      var url = ''; 
      if (data.status == 'succ') { 
       url = data.Result; 
      } 
      else { 
       scope.msgtxt = data.msg; 
      } 
      return url; 
     }); 
    } 
} 

LoginService

myApp.factory('loginService', function ($http, $location, config) { 
    return { 
     login: function (user,url) { 

      return $http.get(url + "/Device/Register", { 
       params: { userName: user.username, password: user.password } 
      }) 
      .then(function (response) { 
       var data = response.data; 
       if (data.status == 'succ') { 
        $location.path('/welcome'); 
        return; 
       } 
       return data.msg; 
      }); 
     } 
    } 
}); 

Контроллер

getURLService.getURL(user).then(function(url){ 
    //assuming you already having value of user available here 
    loginService.login(user,url).then(function(message){ //call login service 
     if(message) 
      $scope.msgtxt = message; 
    }); 
}); 
+0

Прежде всего спасибо за быстрый ответ. Я получаю сообщение об ошибке, что код не определен. Как передать его службе getURL? Извините за мои новички. – Wolf

+0

@wolf в основном вам нужно передать объект пользователя методу getUrl –

+0

Я пробовал это, но потом я получаю, что пользователь не определен. – Wolf

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