angularjs - Angular,当任何资源处于待处理状态时显示加载

标签 angularjs angular-services

我已经编写了一段代码来显示加载器 div,当任何资源处于待处理状态时,无论它是通过 $http.get 还是路由\ng-view 获取的。 我不仅仅想要信息,如果我变坏了......

flowHandler 服务:

app.service('flowHandler', function(){
    var count = 0;
    this.init = function() { count++ };
    this.end = function() { count-- };
    this.take = function() { return count };
});

MainCTRL 追加到 <body ng-controller="MainCTRL">

app.controller("MainCTRL", function($scope, flowHandler){
    var _this = this;
    $scope.pageTitle = "MainCTRL";
    $scope.menu = [];
    $scope.loader = flowHandler.take();

    $scope.$on("$routeChangeStart", function (event, next, current) {
        flowHandler.init();
    });

    $scope.$on("$routeChangeSuccess", function (event, next, current) {
        flowHandler.end();
    });

    updateLoader = function () {
        $scope.$apply(function(){
            $scope.loader = flowHandler.take();
        });

    };

    setInterval(updateLoader, 100);

});

以及通过 $http.get 获取数据时的一些测试 Controller :

app.controller("BodyCTRL", function($scope, $routeParams, $http, flowHandler){
    var _this = this;
    $scope.test = "git";

    flowHandler.init();
    $http.get('api/menu.php').then(function(data) {
        flowHandler.end();
        $scope.$parent.menu = data.data;

    },function(error){flowHandler.end();});
});

现在,我已经将 flowHandler 服务注入(inject)到任何 Controller ,并初始化或结束流程。

这是好主意还是太糟糕了?

有什么建议吗?你是怎么做到的?

最佳答案

您可以使用例如轻松实现一些简洁的东西Bootstrap's progressbars 中的任何一个.

假设您的所有服务都返回 promise

// userService ($q)
app.factory('userService', function ($q) {
  var user = {};
  user.getUser = function () {
    return $q.when("meh");
  };
  return user;
});

// roleService ($resource)
// not really a promise but you can access it using $promise, close-enough :)
app.factory('roleService', function ($resource) {
  return $resource('role.json', {}, { 
    query: { method: 'GET' }
  });
});

// ipService ($http)
app.factory('ipService', function ($http) {
  return {
    get: function () { 
      return $http.get('http://www.telize.com/jsonip');
    }
  };
});

然后你可以在你的 Controller 中应用$scope变量(比方说“加载”),当你所有的链式 promise 都得到解决时,它就会改变。

app.controller('MainCtrl', function ($scope, userService, roleService, ipService) {

  _.extend($scope, {
    loading: false,
    data: { user: null, role: null, ip: null}
  });

  // Initiliaze scope data
  function initialize() {
    // signal we are retrieving data
    $scope.loading = true;

    // get user
    userService.getUser().then(function (data) {
      $scope.data.user = data;
    // then apply role
    }).then(roleService.query().$promise.then(function (data) {
      $scope.data.role = data.role;
    // and get user's ip
    }).then(ipService.get).then(function (response) {
      $scope.data.ip = response.data.ip;
    // signal load complete
    }).finally(function () {
      $scope.loading = false;
    }));
  }

  initialize();
  $scope.refresh = function () {
    initialize();
  };
});

那么你的模板可能看起来像这样。

<body ng-controller="MainCtrl">
<h3>Loading indicator example, using promises</h3>

<div ng-show="loading" class="progress">
  <div class="progress-bar progress-bar-striped active" style="width: 100%">      
      Loading, please wait...
  </div>
</div>

<div ng-show="!loading">
  <div>User: {{ data.user }}, {{ data.role }}</div>
  <div>IP: {{ data.ip }}</div>
  <br>
  <button class="button" ng-click="refresh();">Refresh</button>
</div>

这为您提供了两种“状态”,一种用于加载...

imgur

...以及其他全部完成。 imgur

当然,这不是“现实世界的例子”,但也许是值得考虑的事情。您还可以将这个“加载栏”重构为它自己的指令,然后您可以在模板中轻松使用它,例如

//Usage: <loading-indicator is-loading="{{ loading }}"></loading-indicator>

/* loading indicator */
app.directive('loadingIndicator', function () {
  return {
    restrict: 'E',
    scope: {
      isLoading: '@'
    },
    link: function (scope) {
      scope.$watch('isLoading', function (val) {
          scope.isLoading = val;
      });
    },
    template: '<div ng-show="isLoading" class="progress">' +
              '  <div class="progress-bar progress-bar-striped active" style="width: 100%">' +
              '        Loading, please wait...' +
              '    </div>' +
              '</div>'
  };
});

 

相关的plunker在这里http://plnkr.co/edit/yMswXU

关于angularjs - Angular,当任何资源处于待处理状态时显示加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26366590/

相关文章:

javascript - 将指令的编译函数与隔离范围一起使用似乎访问了错误的范围

javascript - 如何展开 - 在 ui 网格分组中折叠行单击?

angular2 toastr - 没有 toastr 容器已初始化接收 toast

angular - 如何在服务和指令脚本文件中使用 angular2 内置日期管道

javascript - 在 $http.get 调用中获取服务上下文

javascript - 使用 canActivate 防护时 redirectTo 不起作用

javascript - 将记录添加到动态表(使用 AngularJS)会重新加载整个页面

angularjs - 使用 angularjs 渲染 json 而不是 html

javascript - Uncaught Error : [$injector:modulerr] & Uncaught ReferenceError: app is not defined

javascript - 如何使用 AngularJS 创建 5 颗评级星,其中第三颗被禁用