2013-04-08 120 views
1

我正在使用AngularJS編寫一個Web應用程序。我使用第三方庫(提供Angular服務)從數據庫獲取值,然後使用這些庫初始化頁面上的某些下拉/選擇框。在AngularJS的頁面加載中初始化/填充選擇框

所以,我有簡單的選擇框是這樣的:

<div ng-controller="ChoiceCtrl"> 
    <select ng-model="selectedFoo" ng-options="foo in foos"></select> 
    <select ng-model="selectedBar" ng-options="bar in bars"></select> 
</div> 

並初始化爲選擇框的選擇相應的控制器。我使用的服務在從數據庫接收到值之後調用給定的回調函數。 (回調函數可以重構爲一個,但我使用清晰分開的。)

angular.module('choice').controller('ChoiceCtrl', function($scope, ThirdPartyService) { 
    $scope.selectedFoo = ''; 
    $scope.selectedBar = ''; 
    $scope.foos = ''; 
    $scope.bars = ''; 

    var fooCallback = function(result) { 
     $scope.foos = result; 
     $scope.$apply; 
    } 

    var barCallback = function(result) { 
     $scope.bars = result; 
     $scope.$apply; 
    } 

    ThirdPartyService.asyncGetData('fetchFooOptions', fooCallback); 
    ThirdPartyService.asyncGetData('fetchBarOptions', barCallback); 
}); 

數據庫調用是異步的,並在頁面完成後,已呈現的第一次,所以我手動調用$scope.$apply在每個回調函數中。

當加載頁面時異步提取值時,這是在AngularJS應用中初始化下拉/選擇框的正確方法嗎?

我讀過的教程說手動調用$scope.$apply始終是一個「代碼味道」 ......但因爲我從數據庫中獲取的值,操作發生的「角之外」,我認爲它可以使那些呼籲是合理的 - 實際上是必要的。

我也想知道控制器是否適合這些調用。在我讀過的教程中,選項總是在控制器中設置,但這些沙箱實例從未發生異步數據庫調用。

回答

3

您應修改三樣東西在你的代碼

  1. 服務應該返回一個承諾:請參見角文檔創建承諾 內部服務的決心與承諾,當數據從服務器
  2. 內收到控制器只是分配正確的價值觀吧和FOOS時承諾解決
  3. 刪除$ scope.apply因爲你現在正在修改內部的正常角度範圍值

鏈接:Use Promise and service together in Angular

+0

謝謝你,我會看看更多的承諾。 (一旦我有了這樣的聲望,我就會高興地回答你的答案......) – MJV 2013-04-09 10:16:27

相關問題