Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在$http post期间显示进度通知?_Javascript_Angularjs_Angular Material - Fatal编程技术网

Javascript 在$http post期间显示进度通知?

Javascript 在$http post期间显示进度通知?,javascript,angularjs,angular-material,Javascript,Angularjs,Angular Material,通过$http请求使用角度材质组件的最佳方法是什么 我目前的代码如下所示: 进度通告: <md-progress-circular ng-if="determinateValue === 100" md-mode="determinate" value="{{determinateValue}}"></md-progress-circular> 首先设置一些模型: $scope.loading=false; 使用progress循环元素ng show属性绑定该模型:

通过
$http
请求使用角度材质组件的最佳方法是什么

我目前的代码如下所示:

进度通告:

<md-progress-circular ng-if="determinateValue === 100" md-mode="determinate" value="{{determinateValue}}"></md-progress-circular>
首先设置一些模型:

$scope.loading=false;
使用progress循环元素ng show属性绑定该模型:

<md-progress-circular ng-show="loading" md-mode="indeterminate"></md-progress-circular>

希望能有所帮助。

我认为您不需要使用
确定模式下的
属性。相反,您应该使用
不确定
模式,然后使用
ngShow
显示和隐藏进度指示器

<md-progress-circular md-mode="indeterminate" ng-show="isLoading"></md-progress-circular>

如果您想要一个版本的md progress circular,该版本也会禁用屏幕并具有背景,请将md progress circular放置在mdDialog中,如下所示:

     function showWait(){
          $mdDialog.show({
            controller: 'waitCtrl',
            template: '<md-dialog style="background-color:transparent;box-shadow:none">' +
                        '<div layout="row" layout-sm="column" layout-align="center center" aria-label="wait">' +
                            '<md-progress-circular md-mode="indeterminate" ></md-progress-circular>' +
                        '</div>' +
                     '</md-dialog>',
            parent: angular.element(document.body),
            clickOutsideToClose:false,
            fullscreen: false
          })
          .then(function(answer) {

          });
   }
函数showWait(){
$mdDialog.show({
控制器:“waitCtrl”,
模板:“”+
'' +
'' +
'' +
'',
父元素:angular.element(document.body),
单击外部以关闭:false,
全屏显示:错误
})
.然后(函数(答案){
});
}
这是我创建的一个plunker,展示了如何

所有答案都是正确的,只需再添加一件事,
$http
请求是异步的,您应该这样使用

$scope.$apply(function(){
$scope.isLoading = false;
});
<md-progress-circular md-mode="indeterminate" ng-show="isLoading"></md-progress-circular>
总的来说是这样的

$scope.$apply(function(){
$scope.isLoading = false;
});
<md-progress-circular md-mode="indeterminate" ng-show="isLoading"></md-progress-circular>

注意:-答案的来源是公认的答案。

您应该连接到
$httpProvider
的事件:

angular.module('common')
  .config(['$httpProvider', function($httpProvider){
    $httpProvider.interceptors.push(['$rootScope', '$q', '$timeout',
      function($rootScope, $q, $timeout) {
        return {
          request: function(config) {
            $rootScope.posting = new Date().getTime();
            $rootScope.$broadcast('$postingStart', config.url);
            return $q.resolve(config);
          },
          response: function(response) {
            $rootScope.posting = false;
            $rootScope.$broadcast('$postingEnd', response.config.url);
            return $q.resolve(response);
          },
          responseError: function(response) {
            $rootScope.posting = false;
            $rootScope.$broadcast('$postingEnd', response.config.url);
            return $q.reject(response);
          }
        };
      }]);
  }])
.run(['$mdDialog', '$rootScope', function($mdDialog, $rootScope){
  var showing = false;

  function showWait() {
    if(showing) return;
    $mdDialog.show({
      controller: 'waitCtrl',
      template: '<md-dialog id="plz_wait" style="background-color:transparent;box-shadow:none">' +
      '<div layout="row" layout-sm="column" layout-align="center center" aria-label="wait">' +
      '<md-progress-circular md-mode="indeterminate" ></md-progress-circular>' +
      '</div>' +
      '</md-dialog>',
      parent: angular.element(document.body),
      clickOutsideToClose: false,
      fullscreen: false
    })
      .then(function(answer) {
        showing = false;
      });
  }


  $rootScope.$on('$postingStart', function(event, url) {
    if (!$rootScope.postingStartTimer) {
      $rootScope.postingStartTimer = $timeout(function() {
        showWait()
      }, 250);
    }
  });

  $rootScope.$on('$postingEnd', function(event, url) {
    if ($rootScope.postingStartTimer && posts.length === 0) {
      $timeout.cancel($rootScope.postingStartTimer);
      $rootScope.postingStartTimer = false;
      if(!showing) return;
      $mdDialog.cancel();
    }
  });

}])
angular.module('common'))
.config(['$httpProvider',函数($httpProvider){
$httpProvider.interceptors.push(['$rootScope','$q','$timeout',',
函数($rootScope,$q,$timeout){
返回{
请求:函数(配置){
$rootScope.posting=new Date().getTime();
$rootScope.$broadcast(“$postingStart”,config.url);
返回$q.resolve(配置);
},
响应:功能(响应){
$rootScope.posting=false;
$rootScope.$broadcast(“$postingEnd”,response.config.url);
返回$q.resolve(响应);
},
responseError:函数(响应){
$rootScope.posting=false;
$rootScope.$broadcast(“$postingEnd”,response.config.url);
返回$q.reject(响应);
}
};
}]);
}])
.run(['$mdDialog','$rootScope',函数($mdDialog,$rootScope){
var=false;
函数showWait(){
如果(显示)返回;
$mdDialog.show({
控制器:“waitCtrl”,
模板:“”+
'' +
'' +
'' +
'',
父元素:angular.element(document.body),
单击外部以关闭:false,
全屏显示:错误
})
.然后(函数(答案){
显示=假;
});
}
$rootScope.$on(“$postingStart”,函数(事件,url){
如果(!$rootScope.postingStartTimer){
$rootScope.postingStartTimer=$timeout(函数(){
showWait()
}, 250);
}
});
$rootScope.$on(“$postingEnd”,函数(事件,url){
if($rootScope.postingStartTimer&&posts.length==0){
$timeout.cancel($rootScope.postingStartTimer);
$rootScope.postingStartTimer=false;
如果(!显示)返回;
$mdDialog.cancel();
}
});
}])

我希望这段代码能有所帮助

  var isLoadingShown = false;

  $scope.$watch(function() {
    return $http.pendingRequests.length;
  }, 
  function(newValue, oldValue) {
    console.log(newValue);
    if(newValue !== 0) {
      if(!isLoadingShown) {
        showLoading();         
      }
    }
    else hideLoading();
  });

  function showLoading(){
    isLoadingShown = true;   
    $mdDialog.show({
      template: '<md-dialog style="background-color:transparent;box-shadow:none;overflow: hidden !important;">' +
                  '<div layout="row" layout-sm="column" layout-align="center center" aria-label="wait">' +
                    '<md-progress-circular class="md-hue-2" md-diameter="50px"></md-progress-circular>' +
                  '</div>' +
                '</md-dialog>',
      parent: angular.element(document.body),
      clickOutsideToClose:false,
      escapeToClose: false,
      fullscreen: false
    });
  }

  function hideLoading(){
    $mdDialog.cancel();
    isLoadingShown = false; 
  }
var isLoadingShown=false;
$scope.$watch(函数(){
返回$http.pendingRequests.length;
}, 
函数(newValue、oldValue){
console.log(newValue);
如果(新值!==0){
如果(!isLoadingShown){
showLoading();
}
}
else-hideLoading();
});
函数showLoading(){
isLoadingShown=真;
$mdDialog.show({
模板:“”+
'' +
'' +
'' +
'',
父元素:angular.element(document.body),
单击外部以关闭:false,
逃避关闭:错误,
全屏显示:错误
});
}
函数hideLoading(){
$mdDialog.cancel();
isLoadingShown=false;
}

如果您想查看post数据使用的进度

有一个例子

$http({
    method: 'POST',
    url: '/uploadToFtp',
    headers: {
        'Content-Type': undefined
    },
    eventHandlers: {
        progress: function(c) {
            //console.log('Progress -> ' + c);
            //console.log(c);
        }
    },
    uploadEventHandlers: {
        progress: function(e) {
            //console.log('UploadProgress -> ' + e);
            //console.log(e);
            _self.progressValue = (e.loaded / e.total) * 100.0;
        }
    },
    data: postData,
    transformRequest: angular.identity
})
.then(callBack,errorCallBack)
.catch(errorCallBack);
像这样显示进度通知

<md-progress-circular ng-if="ctrl.progressValue > 0 && ctrl.progressValue < 100" md-mode="determinate" value="{{ctrl.progressValue}}"></md-progress-circular>


这可能会帮助您,它需要是一个数字ok,然后将
$scope.loading=1
$scope.loading=0
这也将被视为布尔值
true
false
它希望您一直到100?具有
$scope.loading=1
将在开始时保留它。问题是您似乎没有此任务的编号。如果是多个AJAX调用,您可以将它们添加到某个百分比,但是在这个抽象中,单个AJAX调用是非常二进制的(开始时为0,结束时为100,中间没有事件或数字)。相反,您可能需要此特定事件的“不确定”模式。progress circular不需要是数字吗?我已经编辑了我的答案。ng show将只影响html元素的可见性(true-visible,false-hidden)。在调用loading=false之前,在$http success callback中为$scope.determinateValue赋值,这样就可以继续了。根据文档,在md progress circular中不需要使用determinate模式。把它设为不确定。我相应地编辑了我的答案。
isLoading
应该在请求之前设置为
true
,在请求之后设置为
false
,因为它是在加载时设置的。如果将变量更改为
isLoaded
hasloadded
则当前的true/false是有意义的。此外,这与最初的问题更相关,它可能应该位于
finally
中,以防止加载指示器在错误时永远旋转。这将很好,当阅读此
时,对于要求用户在某些操作完成时等待片刻的操作,它是有意义的,而且不必暴露幕后发生的事情以及需要多长时间,使用一个不确定的指示器。
@MichaelWilson同上:')如何
$http({
    method: 'POST',
    url: '/uploadToFtp',
    headers: {
        'Content-Type': undefined
    },
    eventHandlers: {
        progress: function(c) {
            //console.log('Progress -> ' + c);
            //console.log(c);
        }
    },
    uploadEventHandlers: {
        progress: function(e) {
            //console.log('UploadProgress -> ' + e);
            //console.log(e);
            _self.progressValue = (e.loaded / e.total) * 100.0;
        }
    },
    data: postData,
    transformRequest: angular.identity
})
.then(callBack,errorCallBack)
.catch(errorCallBack);
<md-progress-circular ng-if="ctrl.progressValue > 0 && ctrl.progressValue < 100" md-mode="determinate" value="{{ctrl.progressValue}}"></md-progress-circular>