1

我已经创建了这样的自定义服务

  app.service('userService', function($http,UrlService) {
    return {
        init: function(callback) {
            $http.get(UrlService.baseUrl +'/api/users/list').then(function(user_response) {
                callback(user_response);

            });
        }
    }
})

在我的项目主控制器内部,我已经像这样使用来获得角度材料设计模式。

  $scope.replyComplaint = function(user,complaint_id) {

        complaint_id=user._id;
        console.log(complaint_id)
        $mdDialog.show({
                controller: DialogCtrl,
                templateUrl: 'submodules/user_management/replydialog.html',
                resolve: { complaint_id : function() {return complaint_id;} },
                 locals: {
                   users: $scope.users
                 },
                parent: angular.element(document.body),
                clickOutsideToClose: true,
            })
            .then(function(response) {
                $scope.response = response;
                console.log(response);
            }, function() {
                //fail
            });
    };

为对话框创建了另一个控制器,如在角度材料文档中如下所示

function DialogCtrl($scope, $rootScope, $mdDialog, users,complaintService, UrlService, $http) {
    complaintService.init(function(complaint_response) {
           $scope.complaints = complaint_response.data;
           $scope.getUsers();
        });

$scope.getUsers = function(complaint_id) {
     console.log(complaint_id);
    $scope.hide = function() {
        $mdDialog.hide();
    };
    $scope.cancel = function() {
        $mdDialog.cancel();
    };
    $scope.replyMail = function(complaint_id) {
             console.log(complaint_id);
        $http.post(UrlService.baseUrl + '/api/complaints/complaint/'+complaint_id , {
                complaint: "replyText"
            }, $scope)
            .then(function(response) {
                console.log(name);
                $state.reload();
            }, function(response) {
                console.log(name);
            });
    }
}
}

现在,我需要获取user_response数据DialogController。如果我把console.log('$scope.users')这个userservice.init函数放在里面,我可以得到数据。但不在它之外。如何在 userService.init 函数之外获取响应数据

 userService.init(function(user_response) {
        $scope.users = user_response.data; 
    });        //this is added in DialogController

主要目的是获得user.comlaint_id回复邮件功能的post请求。该 user.complaint_id 是 user_response 的一部分任何人请帮助我。谢谢

4

2 回答 2

2

$http.get调用返回一个承诺,您可以使用它。

app.service('userService', function($http,UrlService) {
  return {
    init: function(callback) {
        return $http.get(UrlService.baseUrl +'/api/users/list');
    }
  }
});

控制器:

function Dialog($scope,$rootScope, $mdDialog,userService,UrlService,$http) {
  // console.log(userService.init());

  init();

  function init() {
    userService.init().then(function(response) {
      $scope.users = response.data; 
    });
  }
}

这还具有更容易错误处理的优点:

function Dialog($scope,$rootScope, $mdDialog,userService,UrlService,$http) {
  // console.log(userService.init());

  init();

  function init() {
    userService.init().then(function(response) {
      $scope.users = response.data; 
    }, function(error) {
      // handle error
    });
  }
}    

您应该阅读 angular/javascript 承诺及其链接机制:Angular Promise

于 2016-05-12T11:58:40.693 回答
1

这是解决方案

userService.init(function(user_response) {
    $scope.users = user_response.data;
    $scope.init();
});

$scope.init = function() {
You can access $scope.users here
}

调用任何需要 $scope.users 的方法而不是 init()

于 2016-05-12T11:40:58.847 回答