将数据从工厂返回到控制器

时间:2017-11-11 22:00:24

标签: angularjs controller factory

我是AngularJS的新手,这是我在stackoverflow中的第一个问题。我一直在为这个问题阅读很多可能的答案,但我没有找到解决方案。我在工厂里有这个(我认为重要的部分是在点之间):

;(() => {
app.factory('Users', users)
users.inject = ['$state', 'UserServices']

function users($state, UserServices) {
  users.users = [];
.....
  users.activeDeactive = (userId, activate) => {
     UserServices.activeDeactive(userId, activate).then(
        response => {
           console.log(response); //it shows "{status: 0}", which is the desired value
           return response;
        }
     )
  }

.....
  return users;
}
})()

这在我的控制器中:

;(() => {
app.controller('UsersCtrl', usersCtrl);

function usersCtrl($scope, $state, Users, users, vendors, profiles, clients) {
   Users.users = users;
.....
   $scope.activeDeactive = function(userId, activate) {
      var response = Users.activeDeactive(userId, activate);
      console.log(response); //it shows undefined
   }
.....
   };
})();

如何在控制器中获得“{status:0}”?我已经坚持了很长时间......我已经读过关于等待服务来解决数据,等待承诺等等...但我认为这个问题要简单得多,因为我已经设法将服务信息发送到这家工厂......现在的问题是将数据从工厂发送到控制器......非常感谢!

2 个答案:

答案 0 :(得分:1)

在控制器中使用以下语法。您的代码无法工作的原因是您编写了一个名为Users.activeDeactive的服务,您从控制器调用它但不等待响应。等待响应非常重要。如果服务调用成功,它将执行然后部分。在这里,您需要像在给定语法中一样捕获响应。 如果出现错误,它将转到错误部分。

    ;(() => {
    app.controller('UsersCtrl', usersCtrl);

    function usersCtrl($scope, $state, Users, users, vendors, profiles, clients) {
       Users.users = users;
    .....
       $scope.activeDeactive = function(userId, activate) {
          Users.activeDeactive(userId, activate).then(function(data){
      response = data;
console.log(response);
   },
   function(error){
       console.log(error);
   });

    .....

   };
})();

答案 1 :(得分:1)

用户工厂方法中的

返回promise。

users.activeDeactive = (userId, activate) => {
 return UserServices.activeDeactive(userId, activate).then(
     response => {
        console.log(response); 
       return response;
    }
 )
}

并在控制器方法中更改为接受解析对象。

 $scope.activeDeactive = function(userId, activate) {
   Users.activeDeactive(userId, activate).then(response =>{
  console.log(response);
 });
}

背后的原因是...... UserService在用户工厂中查找异步方法。所以控制器方法将调用用户工厂方法,并且不会等到用户服务返回数据,因为它进入事件循环。使其工作从用户工厂方法返回承诺。