【问题标题】:Angular JS loading screen and page animationAngular JS 加载屏幕和页面动画
【发布时间】:2013-05-23 05:57:04
【问题描述】:

我正在为一个当前项目学习 AngularJS,我的网站大约有 6 到 7 页。我正在使用 /#/ 导航方案,我想在 XHR 请求关闭获取模板时引入加载/请等待屏幕。

下载模板后,我想调用页面转换,但我真的不知道如何构建或执行它。

这可以简单地完成还是有任何例子?

【问题讨论】:

标签: javascript html angularjs


【解决方案1】:

在 AngularJs 引导时显示加载消息

您可以使用ngCloak

ngCloak 指令用于阻止 Angular html 模板 浏览器在其原始(未编译)中短暂显示 应用程序加载时的表单。使用该指令来避免 html模板显示引起的不良闪烁效果。

示例 CSS

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak
{
    display: none;
}

#splash-page.ng-cloak  /*<-- This has higher specificity so it can display a splash screen*/
{
    display: block;
}

通过承诺显示加载消息

我们实际上使用promise tracker 来跟踪promise 并在它们处于活动状态时显示一条消息,该消息位于github

来自演示:

  <div ng-show="pizzaTracker.active()" style="background:pink;">
    <h1 style="text-align: center;">
      Loading Pizza
      <br />{{pizzaPercent() | number:2}}%
    </h1>
  </div>

并向承诺跟踪器注册$http

$http.get('flavor.json', { tracker: 'pizza' });

【讨论】:

  • 那么,ng-cloak 将隐藏我放置的任何元素,并且一旦加载远程视图,Angular 将删除该指令?我很难理解如何使用它,如果我隐藏我的视图,我仍然需要显示一个“加载”元素(最终将是一个全屏元素),一旦加载了视图,我就需要隐藏加载视图。
  • 举一个ngCloak 的例子,了解我们如何在加载 angularjs 时显示启动画面。
  • 感谢您更新您的示例,但我仍然感到困惑,如果有一些我不明白的基本知识,我仍在学习 Angular。以您为例,如果我要将 ng-cloak 添加到我的 ng-view &lt;div class="span12" ng-view ng-cloak&gt; 中,它将隐藏该跨度,直到编译场景,然后它会显示它。现在,如果我添加一个新的 &lt;div id="splash-page"&gt; 作为第一个 span 的父级,这可能会起作用,但我不知道加载场景后它会如何消失
  • @Mark 我可以将承诺跟踪器与 $resource 一起使用吗?
【解决方案2】:

我通过编写自定义 HTTP 拦截器解决了这个问题。这是示例代码:

var app = angular.module('yourapp', ['loadingService']);

app.config(function ($httpProvider) {
    $httpProvider.responseInterceptors.push('myHttpInterceptor');
    var spinnerFunction = function (data, headers) {
        $('#loading').show();
        return data;
    };
    $httpProvider.defaults.transformRequest.push(spinnerFunction);
});

angular.module('loadingService', [],
    function ($provide) {

        $provide.factory('myHttpInterceptor', function ($q, $window) {
            return function (promise) {
                return promise.then(function (response) {
                    $('#loading').hide();
                    return response;
                }, function (response) {
                    $('#loading').hide();
                    return $q.reject(response);
                });
            };
        });
    });

注意:DOM中应该有一个ID为loading的元素。

【讨论】:

  • 您好,谢谢!这也会影响常规的 http GET/POST Ajax 请求吗?我只想要页面导航的加载屏幕。
  • 是的,它会影响所有 HTTP 请求。所以看来你需要其他解决方案。
  • 您好,虽然您的解决方案有效,但从服务或配置中引用 dom 元素是一个非常糟糕的设计理念。
  • @Spock 那你为什么不给一个更好的呢?
  • 指令可以与ng-show一起使用来显示和隐藏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多