2015-01-15 132 views
0

現在,當我的控制器都開始包含更多的代碼和HTTP請求我是新手-ING我這樣的代碼:初學者的建議和HTTP請求

someApp.controller("SomeCtrl", ["$scope", "$http", function ($scope, $http) { 

    // *** Variables **** 
    var someVar; 

    // **** HTTP **** 
    var httpSomeRequest = function() { 
     $scope.busyWithHttpRequest = true; 
     $scope.hideRequestError = true; 

     $http.get(someUrl). 
      success(function (data, status, headers, config) { 
       $scope.busyWithHttpRequest = false; 
       // Do success things 
      }). 
      error(function (data, status, headers, config) { 
       $scope.busyWithHttpRequest = false; 
       $scope.hideRequestError = false; 
       // Do error things 
     }); 
    }; 

    // **** Functions **** 
    var someFunctionNotUsedInHtml = function() { 
     // Do something here 
    }; 

    // **** Scoped Functions **** 
    $scope.someFuntionUsedInHtml = function() { 
     // Do something here 
    }; 

    // **** Start **** 
    $scope.busyWithHttpRequest = false; 
    $scope.hideRequestError = true; 

    someFunctionNotUsedInHtml(); 
}]); 

現在我的不確定性此代碼是:

  1. 我決定將範圍函數與非範圍函數分開。這是正確的還是應該只是所有功能都成爲範圍的一部分?
  2. 在做的http請求我總是喜歡向用戶展示一些引導微調的東西是怎麼回事,因此「$ scope.busyWithHttpRequest」。這當然會產生很多容易出錯的「打開/關閉」代碼。有沒有更好的辦法? hideRequestError的東西同樣適用。

回答

0

關於2還有一些選項:

2.1使用攔截器,請參閱busyWithHttpRequest設置爲false內成功&錯誤例如http://fdietz.github.io/recipes-with-angular-js/common-user-interface-patterns/displaying-a-loading-spinner.html

2.2相反,它是更好地終於做到這裏面。

我結束了2.2,因爲這對我來說是那麼複雜,通過定義(ReSharper的)模板,我不會犯了一個錯誤,如果我忘了什麼東西。

我發現了另一個有趣的帖子(http://www.peterbe.com/plog/promises-with- $ HTTP)約1參加的所有解決方案的http請求。我也使用Angular的Bootstrap Typeahead。這與承諾一起工作,所以上述結構不適用於此。這是更好地使用下面的結構可應用於所有的HTTP請求的:

$scope.httpGetListForTypeAhead = function (id) { 
    $scope.busyWithHttpRequest = true; 
    $scope.showRequestError = false; 

    var encodedId = encodeURIComponent(id); // As a default I encode all my id's 
    var someUrl = servicesBaseUrl + servicesSomeService + encodedId + servicesSomeServiceBaseParms; 
    return $http.get(someUrl) 
     .then(function (response) { 
      var someArrayToReturnToTypeAhead = []; 

      return someArrayToReturnToTypeAhead; 
     }) 
     .catch(function (ex) { 
      // Add error to a (localstorage based) queue for example which can be send later to the server when http becomes available. 
      $scope.showRequestError = true; 
     }) 
     .finally(function() { 
      $scope.busyWithHttpRequest = false; 
     }); 
};