ngDialog 关闭事件多次触发 (AngularJS)
ngDialog closed event fires multiple times (AngularJS)
我们遇到的问题是当我们侦听事件 'ngDialog.closed' 时,我们发现它触发了多次。我们只打开对话框一次,所以我们假设关闭相同的模式,这个事件也应该只触发一次。整个应用程序有多个模态,我们通过将它附加到 $rootScope 来监听这个特定的模态,如下所示:
$rootScope.$on('ngDialog.closed', function (e, $dialog) {
console.log("CLOSED TEHE MODAL", $dialog);
console.log("EVENT", e);
if($rootScope.modalFinished && localStorage.getItem("tourComplete") !== "true"){
$rootScope.modalFinished = false;
console.log("THIS IS LOCAL STORE:", localStorage.getItem("tourComplete"));
$scope.CallMe();
}
});
我们通过 $rootScope 监听的原因是将此 "closed" 事件从一个控制器(模态)传递到另一个控制器(主屏幕),该控制器已在模态控制器之前加载。
我们注意到在 'ngDialog.closed' 事件中,多个事件被触发(通常每次关闭模态最多触发 2 到 3 次)。
这是我们打开 ngDialog 的地方(在登录控制器中):
$state.go('app.dashboard')
if(AclService.can('edit')|| AclService.can('admin')){
$scope.$on('$stateChangeSuccess', function onStateSuccess(event, toState, toParams, fromState){
$rootScope.modalFinished = true;
CauseService.get().then(function(result){
var cause = result[0].attributes;
if(!cause.has_backlinked || !cause.has_verified_address){
// $rootScope.modalFinished = true;
ngDialog.open({
template: '../../app/views/dashboard/progress_modal.html',
showClose: false,
className: 'ngdialog-theme-default progressModal',
controller: 'ProgressModalController',
resolve:{
'Cause': ['CauseService', function(CauseService){
// console.log("CauseService in routes", CauseService.get());
return CauseService.get();
}]
}
});
}
});
});
}
如有任何帮助,我们将不胜感激。
非常感谢。
-M-
好吧,经过大量的试验和错误,我得出结论,由于将 'ngDialog.close' 事件附加到 $rootScope 并且我们正在监听的控制器已经在模态的控制器加载之前加载,每个控制器将记录模式被关闭的事件。
为了解决这个问题,我将 'ngDialog.close' 事件附加到 $scope,如下所示:
$scope.$on('ngDialog.closed', function (e, $dialog) {
if($rootScope.modalFinished && localStorage.getItem("tourComplete") !== "true"){
$rootScope.modalFinished = false;
console.log("THIS IS LOCAL STORE:", localStorage.getItem("tourComplete"));
console.log("****************NGDIALOG IS CALLED")
$scope.CallMe();
}
});
现在只有 one 'ngDialog.close' 事件的预期行为在仪表板控制器中触发。此解决方案还解决了此侦听器在其他 $states 或控制器中的其他模态上被触发的问题。
希望这个回答能帮到别人,如果有任何反馈,我们将不胜感激!!!!
-M-
//In nebular (angular 4+)
// Closed event identify by below code in nebular lib in Angular 4+
this.dialogService.open(UpdateUseItemComponent, {
hasBackdrop:true ,
closeOnEsc:true,
autoFocus:true,
context: {
data: event
}
}).onClose.subscribe(result => {
this.getStock();
});
我们遇到的问题是当我们侦听事件 'ngDialog.closed' 时,我们发现它触发了多次。我们只打开对话框一次,所以我们假设关闭相同的模式,这个事件也应该只触发一次。整个应用程序有多个模态,我们通过将它附加到 $rootScope 来监听这个特定的模态,如下所示:
$rootScope.$on('ngDialog.closed', function (e, $dialog) {
console.log("CLOSED TEHE MODAL", $dialog);
console.log("EVENT", e);
if($rootScope.modalFinished && localStorage.getItem("tourComplete") !== "true"){
$rootScope.modalFinished = false;
console.log("THIS IS LOCAL STORE:", localStorage.getItem("tourComplete"));
$scope.CallMe();
}
});
我们通过 $rootScope 监听的原因是将此 "closed" 事件从一个控制器(模态)传递到另一个控制器(主屏幕),该控制器已在模态控制器之前加载。
我们注意到在 'ngDialog.closed' 事件中,多个事件被触发(通常每次关闭模态最多触发 2 到 3 次)。
这是我们打开 ngDialog 的地方(在登录控制器中):
$state.go('app.dashboard')
if(AclService.can('edit')|| AclService.can('admin')){
$scope.$on('$stateChangeSuccess', function onStateSuccess(event, toState, toParams, fromState){
$rootScope.modalFinished = true;
CauseService.get().then(function(result){
var cause = result[0].attributes;
if(!cause.has_backlinked || !cause.has_verified_address){
// $rootScope.modalFinished = true;
ngDialog.open({
template: '../../app/views/dashboard/progress_modal.html',
showClose: false,
className: 'ngdialog-theme-default progressModal',
controller: 'ProgressModalController',
resolve:{
'Cause': ['CauseService', function(CauseService){
// console.log("CauseService in routes", CauseService.get());
return CauseService.get();
}]
}
});
}
});
});
}
如有任何帮助,我们将不胜感激。
非常感谢。
-M-
好吧,经过大量的试验和错误,我得出结论,由于将 'ngDialog.close' 事件附加到 $rootScope 并且我们正在监听的控制器已经在模态的控制器加载之前加载,每个控制器将记录模式被关闭的事件。
为了解决这个问题,我将 'ngDialog.close' 事件附加到 $scope,如下所示:
$scope.$on('ngDialog.closed', function (e, $dialog) {
if($rootScope.modalFinished && localStorage.getItem("tourComplete") !== "true"){
$rootScope.modalFinished = false;
console.log("THIS IS LOCAL STORE:", localStorage.getItem("tourComplete"));
console.log("****************NGDIALOG IS CALLED")
$scope.CallMe();
}
});
现在只有 one 'ngDialog.close' 事件的预期行为在仪表板控制器中触发。此解决方案还解决了此侦听器在其他 $states 或控制器中的其他模态上被触发的问题。
希望这个回答能帮到别人,如果有任何反馈,我们将不胜感激!!!!
-M-
//In nebular (angular 4+)
// Closed event identify by below code in nebular lib in Angular 4+
this.dialogService.open(UpdateUseItemComponent, {
hasBackdrop:true ,
closeOnEsc:true,
autoFocus:true,
context: {
data: event
}
}).onClose.subscribe(result => {
this.getStock();
});