【问题标题】:Initial loading spinner for AngularJSAngularJS 的初始加载微调器
【发布时间】:2014-08-18 12:56:22
【问题描述】:

我想在我的应用程序第一次加载时显示一个微调器,例如:https://devart.withgoogle.com/

我曾尝试通过服务模块执行此操作,如下所示:

angular.module('InitialLoad', [])
    .config(function ($httpProvider) {
        $httpProvider.responseInterceptors.push('myHttpInterceptor');
        var spinnerFunction = function (data, headersGetter) {
            $('#loading').fadeIn();
            return data;
        };
        $httpProvider.defaults.transformRequest.push(spinnerFunction);
    })
    .factory('myHttpInterceptor', function ($q, $window) {
        return function (promise) {
            return promise.then(function (response) {
                $('#loading').fadeOut(function(){
                    $(this).remove();
                });
                return response;
            }, function (response) {
               $('#loading').fadeOut(function(){
                    $(this).remove();
                });
                return $q.reject(response);
            });
        };
    });

但是这有很多问题...首先是它不会侦听它侦听每个请求的第一个负载。它也没有像在 DevArt 上那样优雅地显示和隐藏加载,我使用 jQuery 来隐藏和显示加载微调器,而不是使用 Angular Animate。

有人可以帮忙吗?澄清这是针对初始应用程序加载的!而不是为了在后续请求中显示微调器。我为此使用了这个:https://github.com/chieffancypants/angular-loading-bar,但我想为应用程序启动显示一个不同的启动画面。

【问题讨论】:

  • 使用控制器,它们很适合与 UI 交互
  • 有很多方法可以实现这一点。您可以搜索 SO 并找到许多替代方案(即herehere)。我会避免使用 jQuery DOM 操作和动画,因为为此使用它没有任何意义。
  • 好吧,我已经用这个:github.com/chieffancypants/angular-loading-bar 处理多个 AJAX 请求...但我想为 初始加载显示一个启动画面。因此上面的代码。

标签: javascript angularjs


【解决方案1】:

如果您想在加载 AngularJS 时隐藏您的应用程序,则默认使用纯 HTML 显示您的微调器,并使用 ng-cloak 隐藏应用程序的角度部分。

https://docs.angularjs.org/api/ng/directive/ngCloak

应用加载后,您可以使用 ng-hide/ng-show 关闭微调器。

<div ng-controller="TopController">
  <div class="spinner" ng-hide="appLoaded"/>
  <div ng-cloak ng-view>
     ... All Angular view giblets go here...
  </div>
</div>

这是一个工作示例:

http://jsfiddle.net/kLtzm93x/

【讨论】:

  • 我假设 ng-cloak 一旦在代码中被击中就会自动显示而无需任何额外的配置?但是一旦加载了微调器,我该如何隐藏它?正如您在其他答案中的示例需要服务...
  • 我添加了一个提琴手来帮助你
  • 那么我如何检测应用程序已加载?因为您只是使用超时:$timeout(function() { $scope.loaded = true; }, 5000); 并在 5 秒后将加载设置为 true ......但我希望它与资产的实际加载相关(例如,应用程序已准备好并且所有数据都已加载初始视图)。
  • 还是我误解了超时的工作方式? 所有内容都加载完毕后是否倒计时 5 秒?
  • 5 秒后运行该函数。它将在角度加载后 5 秒加载,这样您就可以看到微调器。您不会在普通应用程序中这样做。控制器加载后,应用程序已加载。但是,如果您还想确保数据已加载,那么这是我的第一个答案,您等待服务响应删除微调器。
【解决方案2】:

我不会尝试使用拦截器来执行此操作。使用控制器很容易做到这一点:

app.controller("TopController", [ "$scope", "SomeService", function($scope, SomeService) {
    $scope.showAppLoader = false;

    $scope.loadApp = function() {
       $scope.showAppLoader = true;
       SomeService.doSomething().success( function(result) {
          $scope.showAppLoader = false;
       });
    };

    $scope.loadApp();
}]);

然后是视图:

<div ng-controller="TopController">
   <div class="spinner" ng-show="showAppLoader"></div>
   <div ng-hide="showAppLoader" ng-view"></div>
</div>

剩下的只是一个 CSS 练习。

【讨论】:

  • 什么是 SomeService?我应该将一些东西传递给控制器​​以检查它是否已加载?
  • SomeService 是您创建的一项服务,用于从后端加载数据以启动 UI,以及为什么首先需要显示微调器。
  • 嗯,这将是整个应用程序(例如所有 JS 文件)的加载,而不是实际的数据资源。我该怎么做?
  • 添加了一个新答案,以说明您希望在加载应用程序时完成它,但原理是一样的。
猜你喜欢
  • 2013-07-21
  • 1970-01-01
  • 2012-12-27
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2014-02-02
相关资源
最近更新 更多