javascript - $http加载弹出窗口的最佳实践方法

标签 javascript jquery angularjs

我对 Angular 还很陌生,但我想知道 A)以下场景是否可能,以及 B)一些关于从哪里开始的文档。

场景: 目前,在我的 MEAN 应用程序中,有一个由 jQuery 控制的“正在加载...”弹出窗口,在 $http 请求开始时淡入,并在 $http 请求成功后淡出。

目标: 我认为可能有一种更好的方法来仅使用 Angular 来实现这一点,而不是将 jQuery 与 Angular 混合在一起,所以我不会将两者混合在一起。我还希望能够在显示/隐藏弹出窗口的调用中定义弹出窗口中显示的文本。 IE。 “正在保存新用户...”、“正在删除用户...”。

这在 jQuery 中相对简单,但是处理这种情况的最佳实践 Angular 方法是什么?我猜我会创建一个自定义模块? (也许?)

最佳答案

这里需要遵循的一些 Angular 最佳实践是:

  • 使用服务来维护状态和共享数据
  • 使用指令进行 View 组件封装
  • 避免通过命令式脚本编写 DOM 操作

遵循这些标准的解决方案可能包括...

A value保存加载状态和消息的服务

.value('Loading', {message: '', status: false})

A directive有条件地显示加载消息

JS:

.directive('loading', function(Loading){
  return {
    restrict: 'A',
    link: function(scope) {
      scope.loading = Loading;
    },
    template: '<div ng-show="loading.status">Loading: {{loading.message}} ...'
  }
})

HTML:

<div loading></div>

$http interceptor触发指令的显示

.config(function($provide, $httpProvider){
  $provide.factory('myHttpInterceptor', function($q, Loading) {
    return {

      'request': function(...) { 
        Loading.status = true;
        ...
      },


      'response': function(...) {
        Loading.status = false;
        ...
      },

     'responseError': function(...) {
        Loading.status = false;
        ...
      }
    };
  });

  $httpProvider.interceptors.push('myHttpInterceptor');
})

在此配置中使用这些组件,每当通过 $http 发出请求时,请求和响应都会被拦截。根据请求,加载状态指示器将与加载服务中当前设置的消息一起切换。一旦响应(成功或失败)解决,指示器将关闭。

在本例中,来自 Controller 的 $http 请求示例如下所示:

.controller('MyController', function($scope, $http, Loading){
  $scope.getSomething = function(){
    Loading.message = 'getting something from server';
    $http.get('http://filltext.com/?rows=10&delay=3');
  };
})

注意:您需要将 Loading.message 设置为所有 $http 请求之前,以避免出现不准确的消息。

Demo for proof of concept

关于javascript - $http加载弹出窗口的最佳实践方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979145/

相关文章:

javascript - 在 Jasmine 1.3 中添加自定义匹配器 - 显示未定义

javascript - setState 如何与 memo 一起使用 react

放置在外部文件中的 Javascript 文件未执行

javascript - 嵌入式 YouTube 视频在封闭容器中继续播放

javascript - 如何在图像上显示文字

javascript - 如何将解析的数据放入 <ng-view> 元素之外的导航栏中?

node.js - 如何在 node.js/express 中测试受 csrf 保护的端点

javascript - Not a Legal JSONP API -- 如何在没有 CALLBACK 参数的情况下获取数据

jquery - 使用后取消prependTo

对 IE6 和 IE7 的 Angularjs 历史支持