は、ここで設定し、値を得るために、私の基本的なサービスです見コントローラでサービス変数を設定し、他のどこでも$せずにそれをGET使用します会社のオプションを取得および設定するためのhttpリクエスト(約束付き)。私はこれを一度だけ行います。AngularJSは
.controller('global', ['$scope', '$http', '$api', '$location', '$translate', '$rootScope', '$timeout', '$filter', 'toastr', '$window', 'flag', 'companyService', function ($scope, $http, $api, $location, $translate, $rootScope, $timeout, $filter, toastr, $window, flag, companyService) {
$api('GetCompanyOptions', {})
.then(function (response) {
$scope.companyOptions = response.data
// doing stuff with the response first
// ...
// and setting the value to companyService
companyService.setOptions($scope.companyOptions)
})
}])
ほとんどすべてのコントローラとディレクティブで、この値を使用します。しかし、httpコールには時間がかかるため、タイミングに問題が多かったので、時には空の値が次のように表示されることがありました。(はい、html内に自動的に$ applyが使用され、変数は空ではありません。それは)
$scope.companyOptions = companyService.options
である私は、このような$時計、$タイムアウト、約束、$ rootScopeなどを使用するなど、多くのソリューションを試してみましたが、どれも、私は値を取得し、すべてのコントローラとディレクティブで$ウォッチを使用する以外は働いていない:
$scope.$watch(function() { return companyService.options }, function (newVal) {
// checking if companyService.options is still empty or not
if (!$.isEmptyObject(newVal)) {
// Now the options is filled, do some stuff...
}
})
私の質問は次のとおりです。
- すべてのコントローラで$ watchを使用しています。しかし、それはちょっと乱雑ですので、それらを取り除く方法はありますか?
- すべてのコントローラ/指令で$ watchを使用する代わりに、サービス内で一度使用できますか?
- 「オプション」が空の場合は、サービス内のhttpリクエストを呼び出す方が理にかなっていますか?私は約束を使うことができるように? (しかし、私はこのオプションを他の機能のために選択しない方が良いです。グローバルコントローラ内でcompanyOptionsを取得/設定する方が良いです)