2013-10-29 40 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

相關問題