2013-10-29 65 views
1

我想因素出的angularjs $ HTTP成功回调函数,这样不是有两个(或N)匿名回调函数我有一个名为回调函数问题与参数传递给在angularjs名为回调函数/ JavaScript的

这里有两个控制器:

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; 
      }   
     }); 
    }; 
} 

我不知道该怎么做,因为会变成什么样的命名回调函数有几个依赖(即$范围和$位置)。

如果我解压的功能(称为回调)从angularjs控制器,然后的命名 回调有它的依赖不再访问。

任何人都可以请帮忙分解成功回调函数,并确保相关性得到满足吗?

回答

7

只要将它们作为参数传递即可。

首先,$http.post预计回调接受一个参数。所以我们写了post预计功能:

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

但是函数体需要访问$scope$location。因此,我们写一个接受这些功能和返回功能post预计:

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

现在,我们可以适当命名的功能。让我们看看,它的处理,以新课程的反应,所以我会打电话,要么new_curriculum_callbacknew_curriculum_callbackhandle_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)); 
0

你可能想要创建angularjs服务,并点击某个按钮调用特定的请求。这样你可以以同步的方式调用请求。

+0

嗯。什么意思?这个想法并不是让请求同步,而是要将现在的匿名回调分解成一个已命名的回调。 – balteo

2

创建一个课程服务,并将每个对后端的调用重构为它。 您的控制器不应该关心如何获取数据。将课程服务注入您的控制器。然后,您的控制器只需在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) 
}) 
+0

看来美元范围依赖只适用于控制器。我需要它在我的服务......任何想法? – balteo

+0

在你的控制器中,你可以调用课程服务并使用promise或回调函数处理成功回调。使用回调函数的示例:Curriculum.create($ scope.dataToSave,function(dataFromServer){$ scope。data = dataFromServer)) – bekite

+0

我不确定我在这里关注你...如果可能,请提供更详细的代码示例吗? – balteo

相关问题