3

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

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这里用于其他目的,但似乎我只能使用父级(又名$rootScope)。我只有一个控制器。

所以这里有一些问题:

  1. 在工厂/服务中使用是一种好习惯$scope,还是应该只有控制器必须使用它(因为根据 MVC,我知道$scope代表Viewcurrent Model)。
  2. 我可以return在工厂/服务中忽略,还是他们必须返回一些东西?
  3. 我可以实施promise.then(..)到工厂/服务中吗(意思是:我可以将来自控制器的上述调用放入工厂/服务中)吗?或者是创建承诺并从控制器调用它们的唯一正确方法?
  4. 为什么我不应该service在正文中实现上述逻辑controller
  5. 我可以编写几个在一个服务中相互调用的方法吗?
4

2 回答 2

4

在工厂/服务中使用 $scope 是一种好习惯,还是应该只有控制器必须使用它(因为根据 MVC,我知道 $scope 代表当前模型的视图)。

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

我可以忽略工厂/服务中的退货,还是他们必须退货?

你必须返回你要使用的对象,就像你在这里做的那样。

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

可以在代码中传递您的范围.init,但随后您将指令与控制器耦合

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

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

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

哪个会做?

于 2013-05-10T12:28:48.317 回答
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);
        });
    };
}]);
于 2013-06-05T15:23:33.967 回答