我正在使用 AngularJS 编写一个 Web 应用程序。我使用第三方库(提供 Angular 服务)从数据库中获取值,然后使用这些库来初始化页面上的一些下拉/选择框。
所以,我有这样的简单选择框:
<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
手动调用总是一种“代码味道”......但是由于我从数据库中获取值,所以操作发生在“Angular 之外”,我相信这使得这些调用是合理的——而且实际上是必要的.
我还想知道控制器是否适合这些调用。在我读过的教程中,选项总是在控制器中设置,但那些沙箱示例从来没有发生过异步数据库调用。