在AngularJS中使用工厂/服务的正确方法是什么?

时间:2013-05-10 11:51:40

标签: angularjs

我的基本工厂看起来像这样:

mModule.factory('ajax_post', ['$http',  function(_http) {   
return{
    init: function(jsonData){
        var _promise= _http.post('src/php/data.ajax.php',
            jsonData
            ,{
                headers: {
                    'SOAPActions': 'http://schemas.microsoft.com/sharepoint/soap/UpdateListItems'
                }
            }
            );            
        return _promise; 
    }
}]);

在这里,我在控制器中调用它:

 ajax_post.init($scope.jsonData)
    .then(function (result) {
        if(result.status == 200){
            $scope.isDone = true;
            ....              
        }                 
    }, 
    function (error) {
        alert(error.message);               
    }); 

我想在这里使用$scope用于其他目的,但似乎我只能使用父(aka $rootScope)。我只有一个控制器。

所以这里有一些问题:

  1. 在工厂/服务中使用$scope是好的做法,还是只有控制器必须使用它(因为根据MVC,我知道$scope表示当前的View { {1}})。
  2. 我可以忽略工厂/服务中的Model,还是必须返回某些内容?
  3. 我可以将return实施到工厂/服务中(意思是:我可以将上述呼叫从控制器发送到工厂/服务中)吗?或者是创建承诺并从控制器调用它们的唯一正确方法?
  4. 为什么我不应在promise.then(..)正文中实现上述service逻辑?
  5. 我可以在一个服务中编写几种相互调用的方法吗?

2 个答案:

答案 0 :(得分:4)

  

在工厂/服务中使用$ scope是好的做法,还是只有控制器必须使用它(因为根据MVC,我知道$ scope代表当前模型的View。)

避免修改$ scope并且只做一件事对于可重用性是最好的。

  

我可以忽略工厂/服务中的退货,还是应该退货?

你必须返回你将使用的对象,就像你在这里一样。

  

我可以将promise.then(..)实现到工厂/服务中(意思是:我可以将上述调用从控制器发送到工厂/服务中)吗?或者是创建承诺并从控制器调用它们的唯一正确方法?

可以通过您的.init代码中的范围,但是您将指令与控制器耦合

  

为什么我不在控制器体中实现上述服务逻辑?

控制器不应该知道如何查询microsoft DB。控制器的作用是“准备数据”,而不是获取它们。

  

我可以编写几种在一个服务中相互调用的方法吗?

会怎么做?

答案 1 :(得分:2)

从我看到你想要使用q库。像这样:

app.factory('Data', function ($http, $q) {
    return {
        ajaxItems: function () {
            var deferred = $q.defer();
            $http({ method: "GET", url: "/Home/GetSearchResults" })
                .success(function (data, status, headers, config) {
                    deferred.resolve(data);
                }).error(function (data, status, headers, config) {
                    deferred.reject(data);
                });
            return deferred.promise;
        }
    }
});

app.controller('ResultsCtrl', ['$scope', 'Data', function ($scope, Data) {
    $scope.get = function () {
        $scope.items = Data.ajaxItems();
        // q returns a promise and THEN items
        $scope.items.then(function (items) {
            $scope.items = items;
        }, function (status) {
            console.log(status);
        });
    };
}]);