AngularJS: show loading HTML until data is loaded

后端 未结 4 882
Happy的楠姐
Happy的楠姐 2020-12-23 14:35

How do I have AngularJS show a loading spinner until the data has finished loading?

If my controller has $scope.items = [{name: \"One\"}] set up statica

相关标签:
4条回答
  • 2020-12-23 15:19

    I would create custom directive and put default markup with spinner.

    Here are some links on custom directives

    1) Egghead videos are awesome! http://www.egghead.io/video/xoIHkM4KpHM

    2) Official Angular docs on directives http://docs.angularjs.org/guide/directive

    3) Good overview of angular in 60ish minutes http://weblogs.asp.net/dwahlin/archive/2013/04/12/video-tutorial-angularjs-fundamentals-in-60-ish-minutes.aspx

    0 讨论(0)
  • 2020-12-23 15:22

    I actually have been using a solution for this for a while now that works great and is better than using a timeout in my opinion. I am using $resource, but you could do the same thing with $http. On my $resource objects, I add the bit in the following code that sets loaded to true.

    $scope.customer = $resource(dataUrl + "/Course/Social/" + courseName)
        .get({}, function (data) { data.loaded = true; });
    

    Then, in my view I can use:

    ng-hide="customer.loaded"
    

    Of course, I wouldn't use a $resource directly in a controller, I extract that to a customerRepository service, but it was more simple to show it this way here.

    0 讨论(0)
  • 2020-12-23 15:35

    I would create a custom directive as per the other answer, but here is how you could do it without the directive which might be a good idea to learn before getting into more complex functionality.. A couple things to note:

    1. Using a setTimeout to simulate an ajax call
    2. The loading icon is preloaded and is being hidden when the data loads. Just a simple ng-hide directive.
    3. There is no loading image in my example just some text that gets hidden (obviously your html will have the correct css references).

    Demo: http://plnkr.co/edit/4XZJqnIpie0ucMNN6egy?p=preview

    View:

    <ul >
      <li ng-repeat="item in items">
        <p>Always present: {{item.name}}</p>
        <p>Loads later: {{item.lateLoader}} <i ng-hide="item.lateLoader"  class="icon icon-refresh icon-spin">loading image i don't have</i></p>
      </li>
    </ul>
    

    Controller:

    app.controller('MainCtrl', function($scope) {
      $scope.name = 'World';
      $scope.items = [{name: "One"}];
      setTimeout(function() {
        $scope.$apply(function() {
         $scope.items[0].lateLoader = 'i just loaded';  
        });
      }, 1000);
    });
    
    0 讨论(0)
  • 2020-12-23 15:40

    @lucuma,

    Great answer, an alternative can be to inject $timeout and replace the native timeout function:

    var app = angular.module('plunker', []);
    
    app.controller('MainCtrl', function($scope, $timeout) {
    
            $scope.name = 'World';
            $scope.items = [{name: "One"}];
            $timeout(function() {
                    $scope.$apply(function() {
                            $scope.items[0].lateLoader = 'i just loaded';  
                    });
            }, 1000);
    });
    
    0 讨论(0)
提交回复
热议问题