0

我有一個編碼風格的問題。給定下面的代碼,它使用http服務來檢索數據,然後使用控制器來執行該服務/工廠。看起來好像在控制器的末尾調用makePromise()函數並不是「正確」的做事方式。它的工作原理,但有沒有更好的方式來執行此代碼?也許是最佳做法?我無法想象例如10個左右的執行語句在控制器的末尾......看起來不正確。我只是在尋找更優雅的解決方案。更好的方式來啓動角度控制器

var app = angular.module('app', []); 
app.factory('DataService', function($http, $q) { 
return { 
getData: function() { 
    return $http.get('http://ergast.com/api/f1/2013/driverStandings.json') 
    .then(function(response) { 
     if (typeof response.data == 'object') { 
     return response.data; 
     } else { 
     return $q.reject(response.data); 
     } 
    }, function(response) { 
     return $q.reject(response.data); 
    }) 
    } 
} 
}); 

app.controller('MainCtrl', function($scope, DataService) { 
$scope.driversList = []; 
var makePromise = function() { 
DataService.getData() 
    .then(function(data) { 
    //console.log(data.MRData.StandingsTable.StandingsLists[0].DriverStandings) 
    $scope.driversList = data.MRData.StandingsTable.StandingsLists[0].DriverStandings; 
    }, function(error) { 
    console.log('error') 
    }) 
} 
//THIS IS MY CONCERN HERE... 
makePromise(); 
}) 

回答

2

您不必將它包裝在一個函數中。很多時候我的代碼看起來很像這個。

DataService.getData() 
.then(function(data) { 
//console.log(data.MRData.StandingsTable.StandingsLists[0].DriverStandings) 
    $scope.driversList = data.MRData.StandingsTable.StandingsLists[0].DriverStandings; 
}, function(error) { 
console.log('error') 
}) 

有兩種選擇,第一種是在你的html中使用ng-init =「loadStuff()」。更乾淨的解決方案可能在UI-Router中使用Resolve。所以你的加載數據在路由上發生變化,並且可能在GETs發出時顯示一個加載器。

1

這是個好問題! 我發現最好的辦法是以下功能:

(function() { // init 
    // initialize values on your scope 
})(); 

該指令NG-init不會建議使用它來加載控制器。

「您應該使用控制器而不是ngInit來初始化作用域上的值。」 https://docs.angularjs.org/api/ng/directive/ngInit