1

我想分解angularjs $http 成功回调函数,这样我就有一个名为回调函数的函数,而不是两个(或 N 个)匿名回调函数。

这是两个控制器:

function CreateCurriculumCtrl($scope, $http, $location, select2Options){

    $scope.curriculumInfo = {};
    $scope.curriculumInfo.statusOK = true;
    $scope.select2Options = select2Options; 

    $scope.saveCurriculum = function(){
        $http.post('bignibou/curriculum/new', $scope.curriculumInfo).success(function(curriculumInfo) {
            if(curriculumInfo.statusOK == true){
                $scope.curriculumInfo.statusOK=true;
                $location.path('/view/'+curriculumInfo.curriculum.id);
            }
            else{
                $scope.curriculumInfo.statusOK = false;
                $scope.curriculumInfo.errors = curriculumInfo.errors;
            }           
        });
    };
}

function EditCurriculumCtrl($scope, $http, $location, select2Options, $routeParams){

    $scope.curriculumInfo = {};
    $scope.curriculumInfo.statusOK = true;
    $scope.select2Options = select2Options;
    $scope.id = $routeParams.id;

    $http.get('/bignibou/utils/findCurriculumById.json',{params: {id: $routeParams.id}}).success(
            function(curriculum){
                $scope.curriculumInfo.curriculum = curriculum;
            });

    $scope.editCurriculum = function(){
        $http.post('bignibou/curriculum/edit/'+$routeParams.id, $scope.curriculumInfo)
        .success(function(curriculumInfo) {
            if(curriculumInfo.statusOK == true){
                $scope.curriculumInfo.statusOK=true;
                $location.path('/view/'+curriculumInfo.curriculum.id);
            }
            else{
                $scope.curriculumInfo.statusOK = false;
                $scope.curriculumInfo.errors = curriculumInfo.errors;
            }           
        });
    };
}

我不知道该怎么做,因为命名的回调函数有几个依赖项(即$scope 和$location)。

如果我从 angularjs 控制器中提取函数(命名回调),则命名回调不再访问其依赖项。

任何人都可以帮助分解成功回调函数并确保满足依赖关系吗?

4

3 回答 3

7

只需将它们作为参数传递。

首先,$http.post期望回调接受一个参数。所以我们编写post期望的函数:

function (curriculumInfo) {
    // .....
}

但是函数的主体需要访问$scopeand $location。所以我们编写了一个函数来接受这些并返回post期望的函数:

function (scope,location) {
    return function (curriculumInfo) {
        // ... use scope and location in here
    }
}

现在我们可以适当地命名该函数。让我们看看,它正在处理对新课程的响应,所以我称它为new_curriculum_callbackor or new_curriculum_callbackorhandle_new_curriculum表示它是一个回调:

function handle_new_curriculum (scope,location) {
    return function (curriculumInfo) {
    }
}

现在您可以调用它来将回调函数返回到post

$http
    .post('bignibou/curriculum/new',$scope.curriculumInfo)
    .success(handle_new_curriculum($scope,$location));
于 2013-10-30T02:20:42.817 回答
2

创建一个 Curriculum 服务并将对后端的每个调用重构到其中。您的控制器不应该关心如何获取数据。将课程服务注入您的控制器。然后,您的控制器只需调用 Curriculum 服务上的函数并获取数据。

angular.module('resources.curriculum', ['..'])
.factory('Curriculum', function ($http, $q) {
  return {
    create: function(dataToSave) {
      var deferred = $q.defer()

      http.get('...').success(function(data) {
        deferred.resolve(data)
      }).error(function(err) {
        deferred.reject(err)
      })
      return deferred.promise
    }
  }
})
.controller('SomeCtrl', function($scope, Curriculum) {
  $scope.someValue = Curriculum.create($scope.someDataToSave)
})
于 2013-10-29T17:28:11.583 回答
0

您可能希望创建 angularjs 服务并在单击某个按钮时调用特定请求。这样,您以同步方式调用请求。

于 2013-10-29T17:23:02.930 回答