现在我的控制器代码如下所示:
$scope.spAPI.load(id).then(function(result){
var deferred = $q.defer();
if(result !== undefined){
deferred.resolve($rootScope.$broadcast("onSpLoaded", result));
}
return deferred.promise;
}).then(function(success){
$scope.modalInstance = $modal.open({ ... });
});
我希望在处理广播后打开模态实例。有没有办法做到这一点?
更新:我在倒退思考这个问题。我的意思是在模态实例之后进行广播,无论如何,没关系。
PS:我确实遇到了modalinstance.open回调的问题,但我不得不破解它。我仍在努力正确使用$q,我的代码变得越来越混乱。
你的控制器代码看起来不错,它应该按预期工作,你只是不需要在你的第一个then()
中延迟对象:
$scope.spAPI.load(id).then(function(result){
if(result !== undefined){
$rootScope.$broadcast("onSpLoaded", result);
}
}).then(function(success){
$scope.modalInstance = $modal.open({ ... });
});
这里的原因是$broadcast()
是同步操作,当$broadcast()
返回时,所有事件处理程序都将被调用;而第 2 个then()
中的函数只会在前 then()
返回的函数之后调用,因此$modal.open()
将在所有事件处理程序之后调用。
演示
更新:
您知道$scope.modalInstance.opened
是一个承诺,当显示模态时将解决,因此您可以尝试以下操作来实现您想要的:
$scope.spAPI.load(id).then(function(result){
$scope.modalInstance = $modal.open({ ... });
$scope.modalInstance.opened.then(function() {
$rootScope.$broadcast("onSpLoaded", result));
});
});