将代码从控制器移动到工厂会破坏代码,为什么?

时间:2015-07-11 19:01:04

标签: angularjs

我正在将代码从.controller转移到工厂

这是从控制器

运行的代码
.controller('ChatsCtrl', function ($scope, $http, $rootScope) {
  $http.get('http://<my_ip>:<my_port>/chats', { params: { user_id: $rootScope.session } }).success(function (response) {
    $scope.chats = response;
  });
})

我希望将其重构为工厂,以便控制器看起来像这样

.controller('ChatsCtrl', function ($scope, Chats) {
  $scope.chats = Chats.all();
})

所以工厂就像这样

.factory('Chats', function() {
    return {
      all: function ($scope, $http, $rootScope) {
        return $http.get('http://<my_ip>:<my_port>/chats', { params: { user_id: $rootScope.session } }).success(function (response) {
            $scope.chats = response;
        });
      }
    };
});

因此,当我将代码移动到工厂时,它不会从我的数据库中提取任何内容。我在控制器中引用了“聊天”工厂,但它似乎没有提取数据。

2 个答案:

答案 0 :(得分:1)

返回设置的承诺并将其分配给控制器中的范围。更像这样。

.controller('ChatsCtrl', function ($scope, Chats) {
  Chats.all().success(function (data) {
    $scope.chats = data;
  })
})

.factory('Chats', function($http, $rootScope) {
  return {
    all: function () {
      return $http.get('http://<my_ip>:<my_port>/chats', 
        { params: { user_id: $rootScope.session } })
    }
  };
});

答案 1 :(得分:1)

您可以从工厂返回承诺并在控制器中执行.success(如果您的数据没有更改,可选择在工厂中使用缓存)

.factory('Chats', function() {
    return {
      all: function ($scope, $http, $rootScope) {
        return $http.get('http://<my_ip>:<my_port>/chats', { params: { user_id: $rootScope.session } })
      }
    };
});


.controller('ChatsCtrl', function ($scope, Chats) {
     Chats.all().success(function (response) {
         $scope.chats = response;
     });
})