Angularで非同期操作を処理する適切な方法は、promiseを使用することです。
サービスコールからpromiseを返して、それをsrc
親指で解決することができます。その場合、ディレクティブをまったく使用できなくなります。
コントローラは次のようにサービスを使用します。
function ParentController($scope, imageService) {
$scope.change = function() {
$scope.src = imageService.change();
$scope.then(function(result) {
// the loading ended, but there is no need to set the src
// as it will already bind to src when ends.
}, function(err) {
// something went wrong
});
};
}
あなたのサービス:
app.factory('imageService', function($q, $rootScope) {
function doTheUploading(defer) {
if (everythingOk) {
defer.resolve(thumbSrcString);
} else {
defer.reject({something: 'an error ocurred'});
}
}
return {
change: function() {
// creates the promise
var defer = $q.defer();
doSomethingAsync(defer);
return defer.promise;
}
};
});
少なくとも、HTMLは次のようになります。
<div ng-controller="ParentController">
<img src="{{ src }}"><br><br>
<span class="btn" ng-click="change()">Change!</span>
</div>
進行状況に関しては、コールバックを使用するか、promiseと進行状況インジケーター(つまり:)をもたらすオブジェクトを返す必要がありますreturn {promise: defer.promise, percent: 0}
。次に、進行状況インジケーターをサービス内から更新する必要があります。
src
プロパティに設定する前にサーバーから返されたURLに変換が必要な場合は、promiseをチェーンすることもできます。
$scope.src = imageService.change().then(function(result) {
return 'http://dummyimage.com/' + result;
});
プランカーを更新しました。