【问题标题】:How to get the value returned in the service to a controller in angular?如何将服务中返回的值以角度形式发送给控制器?
【发布时间】:2023-03-12 20:18:01
【问题描述】:

我有如下服务功能。

app.service('UserService',['userFactory',function(userFactory)) {

  this.fetchAllUsers =function(){
  userFactory.getUsers(function(data){
  return data['body'];          //Return Array of objects         

  }),function(error){
            console.log("error while retrieving users")
  }
}
}])

我想在控制器中调用这个函数并将返回的值分配给一个变量。我尝试了以下方式

$scope.usersList=userService.fetchAllUsers();

但是 $scope.usersList 是未定义的。如何从服务中获取返回值。

【问题讨论】:

    标签: angularjs service controller


    【解决方案1】:

    你可能没有在你的控制器中inject你的服务。

    myApp.controller('MyController', ['$scope', 'userService', function($scope, userService) {
       $scope.usersList = userService.fetchAllUsers(); 
    }]);
    

    【讨论】:

      【解决方案2】:

      这就是你在控制器中的做法。

      我假设您定义了一个名为 'userFactory' 的服务

      myApp.controller('MyController', ['$scope', 'userFactory', function($scope, userFactory) {
         $scope.fetchAllUsers = function() {
            userFactory.getUsers().then(function(response) {
                $scope.userlist = data;
            }, function() {});
          }
      }]);
      

      不要在控制器中同时使用$scope and this。使用其中之一。并调用服务方法getUsers。并获得定义为then的成功回调结果。

      【讨论】:

      • 我不想在控制器中声明相同的 $scope.fetchAllUsers() 。它已经在一个名为 UserService 的服务中定义。那么,我怎样才能访问该服务中编写的功能呢?
      【解决方案3】:

      您不能立即返回异步调用的结果,但可以将结果赋值给success(then) callback

      注意success/error callbackangularjs1.6 中已弃用,您必须改用then/catch

      this.fetchAllUsers =function(){
          userFactory.getUsers(function(data){
              $scope.usersList = data['body'];         
          }),function(error){
              console.log("error while retrieving users")
          }
      }
      

      关于如何使用回调定义/调用服务 API。

      // in service
      this.fetchAllUsers(callback) {
        userFactory.getUsers(function(data){
          callback(data);      
        }),function(error){
          console.log("error while retrieving users")
        }
      }
      
      // in controller
      service.fetchAllUsers(function() {
        $scope.usersList = data['body'];   
      });
      

      【讨论】:

      • 如果您必须将任何值传递给 getUsers 怎么办?
      • @Rakeschand 我认为getUsers只有两个回调参数,如果你想传递更多,首先要做的是在getUsers的定义处添加额外的参数。
      • 是的,我要问的是,如果有两个参数作为 id、密码,那么根据您的代码风格,控制器中的语法会是什么样子
      • @Pengyy 但我们不能在服务中使用 $scope 对吗? this.fetchAllUsers() 在服务中定义。
      • @spcd 不,这是userFactory.getUsers中异步调用的回调。这样做没关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多