需要将控制器转换为工厂吗?

时间:2014-10-07 18:53:57

标签: angularjs

我的目标是能够从两个控制器交换数据,我已经被告知我可以创建一个服务,然后将数据注入其他控制器 - 但是我无法将此('somethingDetailCtrl')控制器转换为服务/工厂..

somethingApp.controller('somethingDetailCtrl', ['$scope', '$routeParams', '$http',
    function($scope, $routeParams, $http) {
        $http.get('/assets/javascripts/something/something/' + $routeParams._id +'.json').success(function(data) {
        $scope.thething = data;
    });
}]);

有人会非常友好地指导我完成这项工作(只是将someDetailCtrl转换为工厂),我有大约2天的角度知识,所以任何解释都是受欢迎的。

2 个答案:

答案 0 :(得分:1)

angularjs工厂使用一个函数构造一个新服务,该函数返回一个具有服务公开的所有数据和行为的对象。工厂是单身人士。您的示例控制器正在寻找公开http GET,如果我们不关心错误检查,可以像这样编写:

angular.module('something',[]).factory('Something', function($http) {
    return {
        getSomething: function(callback) {
            $http.get('/something').success(function(data, status) {
                callback(data, status);
            })
        }
    }
}

工厂函数的参数是它的依赖项。在上面的例子中,我们只使用$ http。我们可以通过添加$ q来使用promises ...再次我们在此示例中跳过错误检查:

angular.module('something',[]).factory('Something', function($http, $q) {
    return {
        getSomething: function() {
            var deferred = $q.defer();
            $http.get('/something').success(function(data, status) {
                deferred.resolve(data);
            });
            return deferred.promise;
        }
    }
}

您可以从控制器中使用上述任何一种方法。要使用第一个工厂示例,您可以执行以下操作,其中控制器函数的第二个参数是工厂生成的服务:

angular.module('somethingApp').controller('somethingDetailCtrl', function ($scope, Something) {
    Something.getSomething(function(data) {
        $scope.thething = data;
    });
}

希望这有帮助。

答案 1 :(得分:0)

据我所知,这家工厂写得很好。现在你只需要将它注入你的控制器。例如,要扩展上面的控制器,您可以将其更改为:

somethingApp.controller('somethingDetailCtrl', ['$scope', '$routeParams', 'somethingListFactory',
    function($scope, $routeParams, somethingListFactory) {
        somethingListFactory.list().then(function(data){
             $scope.thething = data;
        });
    });
}]);

编辑:我立即纠正,从工厂中删除以下部分(这是徒劳的):

.then(
     function(result) {
          return result.data;
     });