AngularJS:How请求持续一分钟时取消block-ui弹窗?
AngularJS:How to cancel the block-ui popup when the request lasts for one minute?
在我的 AngularJS 项目中,当有 api 个请求时,我编写自定义指令为 div 添加 block-ui:
angular.module('wapDirectives')
.directive('blockui', function () {
return {
replace: true,
restrict: 'A',
scope: {
option: '=blockOption',
isShow: '=blockShown'
},
link: function (scope, element, attrs, ctrl) {
scope.$watch('isShow', function (newValue) {
if (angular.isDefined(newValue) && newValue) {
element.block(scope.option);
} else {
element.unblock();
}
});
}
}
});
html:
<div class="col-md-9 col-sm-3" style="padding: 0px" blockui block-option="blockOption"
block-shown="hasShown ">
</div>
js:
$scope.hasShown = true;
$q.all(promises).then(function (results) {
$scope.hasShown = false;
//other code
});
当我在请求前设置 $scope.hasShown = ture
并在结果 return 成功时设置 $scope.hasShown = false
时效果很好。
但是,当请求没有return成功时,由于其他reasons:service已经挂断,请求消耗了太多时间...块将永远在那里。
我想修改指令使其在全球范围内工作:当 blcok 持续 60 秒时它将自动取消并向用户发送对话框或刷新页面。
如何简单的做?
你可以试试这个功能
setInterval(function(){$scope.hasShown = false;},3000);
我是用$interval来实现的,但是想知道有没有更好的方案
angular.module('wapDirectives')
.directive('blockui', function () {
return {
replace: true,
restrict: 'A',
scope: {
option: '=blockOption',
isShow: '=blockShown'
},
controller: function ($scope, $element,$interval,wapPromptService,settingInfo) {
$scope.firstTimeSetBlock = null;
$interval(function(){
if($scope.firstTimeSetBlock){
var timeDiff = moment().diff($scope.firstTimeSetBlock) / 1000;
if(timeDiff >= 60){
$scope.firstTimeSetBlock = null;
$element.unblock();
wapPromptService.error("an error occurred");
}
}
},1000);
},
link: function (scope, element, attrs, ctrl) {
scope.$watch('isShow', function (newValue) {
if (angular.isDefined(newValue) && newValue) {
scope.firstTimeSetBlock = moment();
element.block(scope.option);
} else {
scope.firstTimeSetBlock = null;
element.unblock();
}
});
}
}
});
在我的 AngularJS 项目中,当有 api 个请求时,我编写自定义指令为 div 添加 block-ui:
angular.module('wapDirectives')
.directive('blockui', function () {
return {
replace: true,
restrict: 'A',
scope: {
option: '=blockOption',
isShow: '=blockShown'
},
link: function (scope, element, attrs, ctrl) {
scope.$watch('isShow', function (newValue) {
if (angular.isDefined(newValue) && newValue) {
element.block(scope.option);
} else {
element.unblock();
}
});
}
}
});
html:
<div class="col-md-9 col-sm-3" style="padding: 0px" blockui block-option="blockOption"
block-shown="hasShown ">
</div>
js:
$scope.hasShown = true;
$q.all(promises).then(function (results) {
$scope.hasShown = false;
//other code
});
当我在请求前设置 $scope.hasShown = ture
并在结果 return 成功时设置 $scope.hasShown = false
时效果很好。
但是,当请求没有return成功时,由于其他reasons:service已经挂断,请求消耗了太多时间...块将永远在那里。
我想修改指令使其在全球范围内工作:当 blcok 持续 60 秒时它将自动取消并向用户发送对话框或刷新页面。
如何简单的做?
你可以试试这个功能
setInterval(function(){$scope.hasShown = false;},3000);
我是用$interval来实现的,但是想知道有没有更好的方案
angular.module('wapDirectives')
.directive('blockui', function () {
return {
replace: true,
restrict: 'A',
scope: {
option: '=blockOption',
isShow: '=blockShown'
},
controller: function ($scope, $element,$interval,wapPromptService,settingInfo) {
$scope.firstTimeSetBlock = null;
$interval(function(){
if($scope.firstTimeSetBlock){
var timeDiff = moment().diff($scope.firstTimeSetBlock) / 1000;
if(timeDiff >= 60){
$scope.firstTimeSetBlock = null;
$element.unblock();
wapPromptService.error("an error occurred");
}
}
},1000);
},
link: function (scope, element, attrs, ctrl) {
scope.$watch('isShow', function (newValue) {
if (angular.isDefined(newValue) && newValue) {
scope.firstTimeSetBlock = moment();
element.block(scope.option);
} else {
scope.firstTimeSetBlock = null;
element.unblock();
}
});
}
}
});