অ্যাঙ্গুলারজেএস-এ একটি request HTTP অনুরোধের সময় স্পিনার জিআইএফ দেখান?


234

আমি $httpঅ্যাজাক্স অনুরোধ করতে AngularJS এর পরিষেবাটি ব্যবহার করছি ।

অ্যাজাক্স অনুরোধটি কার্যকর করা অবস্থায় একজন স্পিনার জিআইএফ (বা অন্য ধরণের ব্যস্ত সূচক) কীভাবে প্রদর্শিত হবে?

ajaxstarteventঅ্যাঙ্গুলারজেএস ডকুমেন্টেশনে আমি এর মতো কিছুই দেখতে পাচ্ছি না ।


2
আপনি যদি এইচটিটিপি ইন্টারসেপ্টরগুলির উপর ভিত্তি করে কোনও সাধারণ স্পিনার চান তবে তার জন্য আমার একটি কৌণিক মডিউল রয়েছে। এটি জনপ্রিয় সনাক্ত শাম স্পিনার ব্যবহার করে। একবার দেখুন: github.com/harinair/angular-sham-spinner
হরি

1
আমি একটি প্লাগইন কৌণিক-httpshooter লিখেছি , এটি কল শ্যুটিংয়ের ঠিক আগে কনফিগার ডেটা সহ একটি ইভেন্ট প্রকাশ করে এবং রিসোসন উদ্ধার করার পরে অন্যটি মুক্তি দেয়, আপনি সেই ইভেন্টগুলি ধরা বিশ্বব্যাপী লোডার লিখতে পারেন
সিদ্ধার্থ

উত্তর:


88

এখানে বর্তমান অতীতের কৌণিক জেএস অন্তর্ভুক্ত রয়েছে:

angular.module('SharedServices', [])
    .config(function ($httpProvider) {
        $httpProvider.responseInterceptors.push('myHttpInterceptor');
        var spinnerFunction = function (data, headersGetter) {
            // todo start the spinner here
            //alert('start spinner');
            $('#mydiv').show();
            return data;
        };
        $httpProvider.defaults.transformRequest.push(spinnerFunction);
    })
// register the interceptor as a service, intercepts ALL angular ajax http calls
    .factory('myHttpInterceptor', function ($q, $window) {
        return function (promise) {
            return promise.then(function (response) {
                // do something on success
                // todo hide the spinner
                //alert('stop spinner');
                $('#mydiv').hide();
                return response;

            }, function (response) {
                // do something on error
                // todo hide the spinner
                //alert('stop spinner');
                $('#mydiv').hide();
                return $q.reject(response);
            });
        };
    });

//regular angular initialization continued below....
angular.module('myApp', [ 'myApp.directives', 'SharedServices']).
//.......

এখানে এটির বাকি অংশ (এইচটিএমএল / সিএসএস) .... ব্যবহার করা হচ্ছে

$('#mydiv').show(); 
$('#mydiv').hide(); 

এটি টগল করতে। দ্রষ্টব্য: উপরের পোস্টের শুরুতে কৌণিক মডিউলটিতে ব্যবহৃত হয়

#mydiv {  
    position:absolute;
    top:0;
    left:0;
    width:100%;
    height:100%;
    z-index:1000;
    background-color:grey;
    opacity: .8;
 }

.ajax-loader {
    position: absolute;
    left: 50%;
    top: 50%;
    margin-left: -32px; /* -1 * image width / 2 */
    margin-top: -32px;  /* -1 * image height / 2 */
    display: block;     
}

<div id="mydiv">
    <img src="lib/jQuery/images/ajax-loader.gif" class="ajax-loader"/>
</div>

19
নোট করুন যে আপনি angular.element('#mydiv').show()পরিবর্তে ব্যবহার করতে পারেন$('#mydiv').show()
JMaylin

8
আপনার পৃষ্ঠা একাধিক আজ্যাক্স অনুরোধ জানালে এটি কার্যকর হয় না। এটি প্রথম অনুরোধগুলি শেষ হওয়ার পরে লোডিং জিআইএফটি আড়াল করবে।
মীকর

38
অ্যাঙ্গুলারজেএস এর সেরা অনুশীলনগুলির অনুসারে (যা স্বীকৃত সমাধানটি লঙ্ঘন করছে) আপনাকে কোনও নির্দেশিকার বাইরে ডিওএম সংশোধন করা উচিত নয়। নির্দেশের মধ্যে থেকে উপাদানগুলিকে আড়াল করা শো / আড়াল করা বিবেচনা করুন।
মারিউজ

7
আমি নিশ্চিত না যে আমি মন্তব্য করার পক্ষে যথেষ্ট জানি ... তবে এটি করার সঠিক উপায়টি কি ng-classJQuery ব্যবহার করার পরিবর্তে উপাদানগুলি প্রদর্শন করতে এবং আড়াল করার জন্য নির্দেশনাটি ব্যবহার করা উচিত নয়?
জেমস হিল্ড

2
@ জেমসহেলিড সঠিক .. আপনার কখনই কৌনিক কোনও ডম ম্যানিপুলেশন জন্য jQuery ব্যবহার করা উচিত নয়। এটিকে দেখুন: এনজি-ক্লাস, এনজি-ইফ, এনজি-হাইড, এনজি-শো ইত্যাদি ..
jKlaus

471

এটি সত্যিই আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে নির্ভর করে তবে একটি সহজ উপায় এর মতো কোনও প্যাটার্ন অনুসরণ করবে:

.controller('MainCtrl', function ( $scope, myService ) {
  $scope.loading = true;
  myService.get().then( function ( response ) {
    $scope.items = response.data;
  }, function ( response ) {
    // TODO: handle the error somehow
  }).finally(function() {
    // called no matter success or failure
    $scope.loading = false;
  });
});

এবং তারপরে আপনার টেমপ্লেটে এটিতে প্রতিক্রিয়া জানান:

<div class="spinner" ng-show="loading"></div>
<div ng-repeat="item in items>{{item.name}}</div>

223
আপনার যদি একই সাথে একাধিক এজাক্স অনুরোধ থাকে তবে আপনি যখন কোনও অনুরোধ শুরু করেন এবং আপনি এটি করেন তখন আপনি loadingপূর্ণসংখ্যা হিসাবে ঘোষণা করতে পারেন । এবং টেমপ্লেট পরিবর্তন করার কিছুই নেই। কমপক্ষে একটি অনুরোধ $scope.loading = 0;$scope.loading++;$scope.loading--;
চলতে থাকলে স্পিনারটি প্রদর্শিত হয়

16
আপনার সম্ভবত ত্রুটি ফ্যালব্যাক ফাংশনেও লোডিংটিকে মিথ্যা হিসাবে সেট করা উচিত।
sebnukem

3
@ Sebnukem ঠিক আছে আপনি এটি একটি সুন্দর উচ্চ-স্তরের উদাহরণ ছিল, তবে আমি এগিয়ে গিয়েছিলাম এবং এটি স্পষ্টতার জন্য যুক্ত করেছি। সাহায্য করার জন্য ধন্যবাদ!
জোশ ডেভিড মিলার

1
@ জেমালিন - আপনি তারপরে $ ওয়াচ load স্কোপ ব্যবহার করতে পারেন load লোডিং অন্যান্য কাজগুলি করেন
জেসন

5
একটি সাফ উপায়, $scope.loading = falseসাফল্য এবং ব্যর্থ কলব্যাক উভয়ই রাখার পরিবর্তে এটিতে রাখা .finally()। দেখে মনে হবে:mySvc.get().then(success, fail).finally(function() { $scope.loading = false; });
টম

44

এখানে একটি directiveএবং ব্যবহার করে একটি সংস্করণ দেওয়া আছে ng-hide

এটি কৌণিক পরিষেবাগুলির মাধ্যমে সমস্ত কল চলাকালীন লোডারটি প্রদর্শন করবে $http

টেমপ্লেটে:

<div class="loader" data-loading></div>

নির্দেশে:

angular.module('app')
  .directive('loading', ['$http', function ($http) {
    return {
      restrict: 'A',
      link: function (scope, element, attrs) {
        scope.isLoading = function () {
          return $http.pendingRequests.length > 0;
        };
        scope.$watch(scope.isLoading, function (value) {
          if (value) {
            element.removeClass('ng-hide');
          } else {
            element.addClass('ng-hide');
          }
        });
      }
    };
}]);

ng-hideউপাদানটিতে ক্লাস ব্যবহার করে আপনি jquery এড়াতে পারবেন।


কাস্টমাইজ করুন: একটি যোগ করুন interceptor

আপনি যদি লোডিং-ইন্টারসেপ্টার তৈরি করেন তবে আপনি শর্তের ভিত্তিতে লোডারটি প্রদর্শন / আড়াল করতে পারেন।

নির্দেশে:

var loadingDirective = function ($rootScope) {
  return function ($scope, element, attrs) {
      $scope.$on("loader_show", function () {
          return element.removeClass('ng-hide');
      });
      return $scope.$on("loader_hide", function () {
          return element.addClass('ng-hide');
      });
  };
};

আটককারী:

  • উদাহরণস্বরূপ: spinnerকখন দেখাবেন নাresponse.background === true;
  • বাধা requestএবং / অথবা responseসেট $rootScope.$broadcast("loader_show");বা$rootScope.$broadcast("loader_hide");

একটি ইন্টারসেপ্টর লেখার উপর আরও তথ্য


@ পঙ্করোকপলি আমার নির্দিষ্ট দৃশ্যে, আমার কাছে দুটি পরিষেবা সম্পর্কিত একটি স্বতন্ত্র উপাদান রয়েছে। তবে এটি কেবল তাদের একজনের জন্যই কাজ করে, আমি কি পুনরায় ব্যবহারযোগ্য করে তোলার জন্য কোনও পরামিতি বা কিছু পাস করব?
রিকার্ডোগোঞ্জেলস

@ রেজারব্ল্যাড আপনি যে $httpকোনও পরিষেবাতে কল করার সময় এটি স্পিন করবে ।
punkrockpolly

31

আপনি যদি এনজিআর রিসোর্স ব্যবহার করে থাকেন তবে কোনও বস্তুর $ সমাধানযুক্ত বৈশিষ্ট্যটি লোডারদের জন্য দরকারী:

নিম্নলিখিত হিসাবে একটি উত্স জন্য:

var User = $resource('/user/:id', {id:'@id'});
var user = User.get({id: 1})

আপনি রিসোর্স অবজেক্টের $ সমাধানযুক্ত বৈশিষ্ট্যের সাথে কোনও লোডারকে লিঙ্ক করতে পারেন:

<div ng-hide="user.$resolved">Loading ...</div>

14

https://github.com/wongatech/angular-http-loader এটির জন্য একটি ভাল প্রকল্প।

এখানে উদাহরণস্বরূপ http://wongatech.github.io/angular-http-loader/

কোনও অনুরোধ যখন ঘটছে তখন নীচের কোডটি একটি টেম্পলেট উদাহরণ / loader.tpl.html দেখায়।

<div ng-http-loader template="example/loader.tpl.html"></div>

13

সবেমাত্র angular-busyনির্দেশটি আবিষ্কার করেছেন যা কিছু অ্যাসিঙ্ক কলের উপর নির্ভর করে কিছুটা লোডার দেখায়।

উদাহরণস্বরূপ, যদি আপনাকে কোনও করতে হয় GETতবে প্রতিশ্রুতিটি আপনার $scope,

$scope.req = $http.get('http://google.fr');

এবং এটি যেমন কল:

<div cg-busy="req"></div>

এখানে GitHub

আপনি এটি ব্যবহার করে ইনস্টল করতে পারেন bower(আপনার প্রকল্পের নির্ভরতা আপডেট করতে ভুলবেন না):

bower install angular-busy --save

ডকুমেন্টেশনে কীভাবে "কিছু উপাদানকে অক্ষম করা যায়" তা আমি খুঁজে পাইনি। আপনি কিভাবে ব্যাখ্যা করতে পারেন? উদাহরণস্বরূপ, স্পিনার দেখানোর সময় আমি একটি বোতাম অক্ষম করতে চাই।
সি

কৌণিক-ব্যস্ত কেবল আপনার উপাদানটিকে একটি মুখোশ রাখুন, আমি মনে করি না আপনি যেমন করতে চান তেমন একটি বোতাম অক্ষম করতে পারবেন তবে আপনি এই চিত্রটি দেওয়ার জন্য খালি টেম্পলেট দিয়ে ব্যাকড্রপটি সেট করতে পারেন। আমি কোনও স্থানীয় বক্তা নই, বিভ্রান্তির জন্য দুঃখিত :)
বালথাজার

ঠিক আছে, অন্য কারওর মতো বিভ্রান্তি না ঘটায় আমি আপনার উত্তর সম্পাদনা করেছি। ফরাসী ভাষায় অন্য ফরাসীতে ইংরেজী বলতে সবসময় বিভ্রান্তি
ঘটে

5

আপনি যদি কোনও এপিআই কলগুলি কোনও পরিষেবা / কারখানার মধ্যে আবদ্ধ করেন তবে আপনি সেখানে লোডিং কাউন্টারটি ট্র্যাক করতে পারবেন (প্রতি উত্তর হিসাবে) আবদ্ধ করেন এবং @ জে মেলিনের একযোগে চমৎকার পরামর্শ), এবং নির্দেশের মাধ্যমে লোডিং কাউন্টারটি উল্লেখ করতে পারেন। বা এর কোনও সমন্বয়।

এপিআই মোড়ক

yourModule
    .factory('yourApi', ['$http', function ($http) {
        var api = {}

        //#region ------------ spinner -------------

        // ajax loading counter
        api._loading = 0;

        /**
         * Toggle check
         */
        api.isOn = function () { return api._loading > 0; }

        /**
         * Based on a configuration setting to ignore the loading spinner, update the loading counter
         * (for multiple ajax calls at one time)
         */
        api.spinner = function(delta, config) {
            // if we haven't been told to ignore the spinner, change the loading counter
            // so we can show/hide the spinner

            if (NG.isUndefined(config.spin) || config.spin) api._loading += delta;

            // don't let runaway triggers break stuff...
            if (api._loading < 0) api._loading = 0;

            console.log('spinner:', api._loading, delta);
        }
        /**
         * Track an ajax load begin, if not specifically disallowed by request configuration
         */
        api.loadBegin = function(config) {
            api.spinner(1, config);
        }
        /**
         * Track an ajax load end, if not specifically disallowed by request configuration
         */
        api.loadEnd = function (config) {
            api.spinner(-1, config);
        }

        //#endregion ------------ spinner -------------

        var baseConfig = {
            method: 'post'
            // don't need to declare `spin` here
        }

        /**
         * $http wrapper to standardize all api calls
         * @param args stuff sent to request
         * @param config $http configuration, such as url, methods, etc
         */
        var callWrapper = function(args, config) {
            var p = angular.extend(baseConfig, config); // override defaults

            // fix for 'get' vs 'post' param attachment
            if (!angular.isUndefined(args)) p[p.method == 'get' ? 'params' : 'data'] = args;

            // trigger the spinner
            api.loadBegin(p);

            // make the call, and turn of the spinner on completion
            // note: may want to use `then`/`catch` instead since `finally` has delayed completion if down-chain returns more promises
            return $http(p)['finally'](function(response) {
                api.loadEnd(response.config);
                return response;
            });
        }

        api.DoSomething = function(args) {
            // yes spinner
            return callWrapper(args, { cache: true });
        }
        api.DoSomethingInBackground = function(args) {
            // no spinner
            return callWrapper(args, { cache: true, spin: false });
        }

        // expose
        return api;
    });

স্পিনার ডাইরেক্টিভ

(function (NG) {
    var loaderTemplate = '<div class="ui active dimmer" data-ng-show="hasSpinner()"><div class="ui large loader"></div></div>';

    /**
     * Show/Hide spinner with ajax
     */
    function spinnerDirective($compile, api) {
        return {
            restrict: 'EA',
            link: function (scope, element) {
                // listen for api trigger
                scope.hasSpinner = api.isOn;

                // attach spinner html
                var spin = NG.element(loaderTemplate);
                $compile(spin)(scope); // bind+parse
                element.append(spin);
            }
        }
    }

    NG.module('yourModule')
        .directive('yourApiSpinner', ['$compile', 'yourApi', spinnerDirective]);
})(angular);

, USAGE

<div ng-controller="myCtrl" your-api-spinner> ... </div>

5

পৃষ্ঠাগুলি লোড এবং মডেলের জন্য, সবচেয়ে সহজ উপায় হ'ল ng-showনির্দেশকে ব্যবহার করা এবং স্কোপ ডেটা ভেরিয়েবলগুলির একটি ব্যবহার করা। কিছুটা এইরকম:

ng-show="angular.isUndefined(scope.data.someObject)".

এখানে someObjectঅনির্ধারিত অবস্থায় স্পিনার দেখিয়ে দেবেন। পরিষেবাটি ডেটা সহ ফিরে আসে এবং someObjectজনবহুল হয়ে যায়, স্পিনারটি তার লুকানো অবস্থায় ফিরে আসবে।


3

আমার মনে হয় কোনও স্পিনার যোগ করার এটি সহজতম উপায়: -

আপনি এই সুন্দর স্পিনারগুলির মধ্যে যে কোনও একটির ডিভি ট্যাগ সহ এনজি-শো ব্যবহার করতে পারেন http://tobiasahlin.com/spinkit/ {{এটি আমার পৃষ্ঠা নয়}}

এবং তারপরে আপনি এই জাতীয় যুক্তি ব্যবহার করতে পারেন

//ajax start
    $scope.finderloader=true;
    
          $http({
    method :"POST",
    url : "your URL",
  data: { //your data
     
     }
  }).then(function mySucces(response) {
    $scope.finderloader=false;
      $scope.search=false;          
    $scope.myData =response.data.records;
  });
     
    //ajax end 
    
<div ng-show="finderloader" class=spinner></div>
//add this in your HTML at right place


3
Based on Josh David Miller response:

  <body>
  <header>
  </header>
<div class="spinner" ng-show="loading">
  <div class="loader" ></div>
</div>

<div ng-view=""></div>

<footer>
</footer>

</body>

এই সিএসএস যুক্ত করুন:

    .loader {
  border: 16px solid #f3f3f3;
  border-radius: 50%;
  border-top: 16px solid #3498db;
  border-bottom : 16px solid black;
  width: 80px;
  height: 80px;
  -webkit-animation: spin 2s linear infinite;
  animation: spin 2s linear infinite;
  position: absolute;
  top: 45%;
  left: 45%;
}

@-webkit-keyframes spin {
  0% { -webkit-transform: rotate(0deg); }
  100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}


.spinner{
  width: 100%;
height: 100%;
z-index: 10000;
position: absolute;
top: 0;
left: 0;
margin: 0 auto;
text-align: center;
vertical-align: middle;
background: white;
opacity: 0.6;
}

এবং কেবল আপনার কৌণিক যুক্ত করুন:

$ রুটস্কোপ.লোডিং = মিথ্যা; $ রুটস্কোপ.লোডিং = সত্য; -> যখন $ http.get শেষ হয়।


2

@ বুল্টরিয়াসের দুর্দান্ত উত্তরটির আমার সংস্করণটি ভাগ করে নেওয়া, নতুন কৌণিক বিল্ডগুলির জন্য আপডেট করা হয়েছে (আমি এই কোডের সাথে 1.5.8 সংস্করণ ব্যবহার করেছি), এবং একাধিক যুগপত অনুরোধগুলির দৃ rob় হতে যাতে @ জেএমলিনের একটি কাউন্টার ব্যবহার করার ধারণাও অন্তর্ভুক্ত করা হয়েছে এবং অনুরোধগুলির জন্য অ্যানিমেশনটি প্রদর্শন করতে এড়াতে বিকল্পটি সর্বনিম্ন সংখ্যক মিলিসেকেন্ডের চেয়ে কম গ্রহণ করে:

var app = angular.module('myApp');
var BUSY_DELAY = 1000; // Will not show loading graphic until 1000ms have passed and we are still waiting for responses.

app.config(function ($httpProvider) {
  $httpProvider.interceptors.push('busyHttpInterceptor');
})
  .factory('busyHttpInterceptor', ['$q', '$timeout', function ($q, $timeout) {
    var counter = 0;
    return {
      request: function (config) {
        counter += 1;
        $timeout(
          function () {
            if (counter !== 0) {
              angular.element('#busy-overlay').show();
            }
          },
          BUSY_DELAY);
        return config;
      },
      response: function (response) {
        counter -= 1;
        if (counter === 0) {
          angular.element('#busy-overlay').hide();
        }
        return response;
      },
      requestError: function (rejection) {
        counter -= 1;
        if (counter === 0) {
          angular.element('#busy-overlay').hide();
        }
        return rejection;
      },
      responseError: function (rejection) {
        counter -= 1;
        if (counter === 0) {
          angular.element('#busy-overlay').hide();
        }
        return rejection;
      }
    }
  }]);

2

আপনি http অনুরোধ কল পরিচালনা করতে কৌণিক ইন্টারসেপ্টার ব্যবহার করতে পারেন

  <div class="loader">
    <div id="loader"></div>
  </div>

<script>
    var app = angular.module("myApp", []);

    app.factory('httpRequestInterceptor', ['$rootScope', '$location', function ($rootScope, $location) {
        return {
            request: function ($config) {
                $('.loader').show();
                return $config;
            },
            response: function ($config) {
                $('.loader').hide();
                return $config;
            },
            responseError: function (response) {
                return response;
            }
        };
    }]);

    app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider',
        function ($stateProvider, $urlRouterProvider, $httpProvider) {
            $httpProvider.interceptors.push('httpRequestInterceptor');
        }]);

</script>

https://stackoverflow.com/a/49632155/4976786


2

ইন্টারসেপ্টর বা jQuery ছাড়াই সহজ উপায়

কোনও স্পিনারকে দেখানোর এটি একটি সহজ উপায় যার জন্য তৃতীয় পক্ষের লাইব্রেরি, ইন্টারসেপ্টর বা জিকিউরিয়ার প্রয়োজন হয় না।

কন্ট্রোলারে, একটি পতাকা সেট এবং পুনরায় সেট করুন।

function starting() {
    //ADD SPINNER
    vm.starting = true;
    $http.get(url)
      .then(function onSuccess(response) {
        vm.data = response.data;
    }).catch(function onReject(errorResponse) {
        console.log(errorResponse.status);
    }).finally(function() {
        //REMOVE SPINNER
        vm.starting = false;
    });
};

এইচটিএমএলে, পতাকাটি ব্যবহার করুন:

<div ng-show="vm.starting">
    <img ng-src="spinnerURL" />
</div>

<div ng-hide="vm.starting">
    <p>{{vm.data}}</p>
</div>

এক্সএইচআর শুরু হওয়ার সাথে সাথে এক্সএইচআর সম্পূর্ণ হওয়ার পরে vm.startingপতাকাটি সেট করা হয় true


1

এটি আমার পক্ষে ভাল কাজ করে:

এইচটিএমএল:

  <div id="loader" class="ng-hide" ng-show="req.$$state.pending">
    <img class="ajax-loader" 
         width="200" 
         height="200" 
         src="/images/spinner.gif" />
  </div>

কৌণিক:

  $scope.req = $http.get("/admin/view/"+id).success(function(data) {          
      $scope.data = data;
  });

$ Http থেকে ফিরে আসা প্রতিশ্রুতি মুলতুবি থাকা অবস্থায়, এনজি-শো এটিকে "সত্যবাদী" বলে মূল্যায়ন করবে। প্রতিশ্রুতিটি সমাধান হয়ে গেলে এটি স্বয়ংক্রিয়ভাবে আপডেট হয়ে যায় ... যা আমরা চাই ঠিক তা-ই।


এটি করার গতিময় উপায় নয়।
উমাইর হামিদ

আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন আপনি বিশ্বাস করেন যে এই লক্ষ্য অর্জনের জন্য এটি গতিশীল উপায় নয়। এটি অন্যদের এই পোস্টটি পড়তে সহায়তা করবে। ধন্যবাদ.
কুয়াশাচ্ছন্ন

আমার আবেদনে আমার একাধিক অনুরোধ রয়েছে। । সুযোগ.আরেক শুধুমাত্র একক অনুরোধের জন্য কাজ করবে। যখন এই বিশেষ অনুরোধটি সম্পূর্ণ লোডারটি আড়াল করবে এবং অন্যান্য অনুরোধগুলি সম্পূর্ণ করার জন্য অপেক্ষা করবে না। এটি অর্জনের সর্বোত্তম উপায় হ'ল ইন্টারসেপ্টর ব্যবহার করা।
উমায়ের হামিদ

1

HTTP অনুরোধে লোডিং বারটি দেখানোর জন্য নিম্নলিখিত ইন্টারসেপ্টর ব্যবহার করা হয়েছে

'use strict';
appServices.factory('authInterceptorService', ['$q', '$location', 'localStorage','$injector','$timeout', function ($q, $location, localStorage, $injector,$timeout) {

var authInterceptorServiceFactory = {};
var requestInitiated;

//start loading bar
var _startLoading = function () {
   console.log("error start loading");
   $injector.get("$ionicLoading").show();

}

//stop loading bar
var _stopLoading = function () {
    $injector.get("$ionicLoading").hide();
}

//request initiated
var _request = function (config) {
     requestInitiated = true;
    _startLoading();
    config.headers = config.headers || {};
    var authDataInitial = localStorage.get('authorizationData');
    if (authDataInitial && authDataInitial.length > 2) {
        var authData = JSON.parse(authDataInitial);
        if (authData) {
            config.headers.Authorization = 'Bearer ' + authData.token;
        }
    }
    return config;
}

//request responce error
var _responseError = function (rejection) {
   _stopLoading();
    if (rejection.status === 401) {
        $location.path('/login');
    }
    return $q.reject(rejection);
}

//request error
var _requestError = function (err) {
   _stopLoading();
   console.log('Request Error logging via interceptor');
   return err;
}

//request responce
var _response = function(response) {
    requestInitiated = false;

   // Show delay of 300ms so the popup will not appear for multiple http request
   $timeout(function() {

        if(requestInitiated) return;
        _stopLoading();
        console.log('Response received with interceptor');

    },300);

return response;
}



authInterceptorServiceFactory.request = _request;
authInterceptorServiceFactory.responseError = _responseError;
authInterceptorServiceFactory.requestError = _requestError;
authInterceptorServiceFactory.response = _response;

return authInterceptorServiceFactory;
}]);

0
.factory('authHttpResponseInterceptor', ['$q', function ($q) {
        return {
            request: function(config) {
                angular.element('#spinner').show();
                return config;
            },
            response : function(response) {
                angular.element('#spinner').fadeOut(3000);
                return response || $q.when(response);
            },
            responseError: function(reason) {
                angular.element('#spinner').fadeOut(3000);
                return $q.reject(reason);
            }
        };
    }]);



 .config(['$routeProvider', '$locationProvider', '$translateProvider', '$httpProvider',
            function ($routeProvider, $locationProvider, $translateProvider, $httpProvider) {
                $httpProvider.interceptors.push('authHttpResponseInterceptor');
    }
]);

in your Template
<div id="spinner"></div>


css   

#spinner,
#spinner:after {
  border-radius: 50%;
  width: 10em;
  height: 10em;
  background-color: #A9A9A9;
  z-index: 10000;
  position: absolute;
  left: 50%;
  bottom: 100px;
}
@-webkit-keyframes load8 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@keyframes load8 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

1
কেবলমাত্র কোডের উত্তরগুলি খুব বেশি কার্যকর নয়।
ফ্যান্টেম্যাক্সেক্স

0

এই কোড দিয়ে নির্দেশ তৈরি করুন:

$scope.$watch($http.pendingRequests, toggleLoader);

function toggleLoader(status){
  if(status.length){
    element.addClass('active');
  } else {
    element.removeClass('active');
  }
}

0

বিভিন্ন ইউআরএল পরিবর্তনের মধ্যে লোড দেখানোর আরেকটি সমাধান হ'ল:

$rootScope.$on('$locationChangeStart', function() {
  $scope.loading++;
});

$rootScope.$on('$locationChangeSuccess', function() {
  $timeout(function() {
    $scope.loading--;
  }, 300);
});

এবং তারপরে মার্কআপে কেবল স্পিনারকে টগল করুন ng-show="loading"

আপনি যদি এজাক্সের অনুরোধগুলিতে এটি প্রদর্শন করতে চান $scope.loading++তবে অনুরোধটি কখন শুরু হয় এবং কখন এটি যুক্ত হয় তা যুক্ত করুন $scope.loading--


0

আপনি এ জাতীয় কিছু চেষ্টা করতে পারেন:

নির্দেশনা তৈরি করুন:

myApp.directive('loader', function () {
    return {
        restrict: 'A',
        scope: {cond: '=loader'},
        template: '<span ng-if="isLoading()" class="soft"><span class="fa fa-refresh fa-spin"></span></span>',
        link: function (scope) {
            scope.isLoading = function() {
                var ret = scope.cond === true || (
                        scope.cond &&
                        scope.cond.$$state &&
                        angular.isDefined(scope.cond.$$state.status) &&
                        scope.cond.$$state.status === 0
                    );
                return ret;
            }
        }
    };
}); 

তারপরে আপনি মেইন সিটিআরএলে এর মতো কিছু যুক্ত করুন

    // Return TRUE if some request is LOADING, else return FALSE
    $scope.isLoading = function() {
        return $http.pendingRequests.length > 0;
    };

এবং HTML এর মতো দেখতে পারে:

<div class="buttons loader">
    <span class="icon" loader="isLoading()"></span>
</div>

0

নিম্নলিখিত উপায়ে সমস্ত অনুরোধগুলির নোট নেবে এবং সমস্ত অনুরোধগুলি শেষ হয়ে গেলে কেবল লুকিয়ে রাখবে:

app.factory('httpRequestInterceptor', function(LoadingService, requestCount) {
    return {
        request: function(config) {
            if (!config.headers.disableLoading) {
                requestCount.increase();
                LoadingService.show();
            }
            return config;
        }
    };
}).factory('httpResponseInterceptor', function(LoadingService, $timeout, error, $q, requestCount) {
    function waitAndHide() {
        $timeout(function() {
            if (requestCount.get() === 0){
                LoadingService.hide();
            }
            else{
                waitAndHide();
            }
        }, 300);
    }

    return {
        response: function(config) {
            requestCount.descrease();
            if (requestCount.get() === 0) {
                waitAndHide();
            }
            return config;
        },
        responseError: function(config) {
            requestCount.descrease();
            if (requestCount.get() === 0) {
                waitAndHide();
            }
            var deferred = $q.defer();
            error.show(config.data, function() {
                deferred.reject(config);
            });
            return deferred.promise;
        }
    };
}).factory('requestCount', function() {
    var count = 0;
    return {
        increase: function() {
            count++;
        },
        descrease: function() {
            if (count === 0) return;
            count--;
        },
        get: function() {
            return count;
        }
    };
})


0

যেহেতু অবস্থানের কার্যকারিতা : ফিক্সটি সম্প্রতি পরিবর্তিত হয়েছে, জিআইএফ লোডারটি সমস্ত উপাদানগুলির উপরে দেখাতে আমার অসুবিধা হয়েছিল, সুতরাং আমাকে কৌনিকের ইনবিল্ট জিকুয়েরি ব্যবহার করতে হয়েছিল ।

এইচটিএমএল

<div ng-controller="FetchController">
      <div id="spinner"></div>
</div>

CSS

#spinner {display: none}
body.spinnerOn #spinner { /* body tag not necessary actually */
   display: block;
   height: 100%;
   width: 100%;
   background: rgba(207, 13, 48, 0.72) url(img/loader.gif) center center no-repeat;
   position: fixed;
   top: 0;
   left: 0;
   z-index: 9999;
}
body.spinnerOn main.content { position: static;} /* and whatever content needs to be moved below your fixed loader div */

নিয়ামক

app.controller('FetchController', ['$scope', '$http', '$templateCache', '$location', '$q',
function($scope, $http, $templateCache, $location, $q) {

angular.element('body').addClass('spinnerOn'); // add Class to body to show spinner

$http.post( // or .get(
    // your data here
})
.then(function (response) {
    console.info('success');     
    angular.element('body').removeClass('spinnerOn'); // hide spinner

    return response.data;               
}, function (response) {                   
    console.info('error'); 
    angular.element('body').removeClass('spinnerOn'); // hide spinner
});

})

আশাকরি এটা সাহায্য করবে :)


0

সমস্ত উত্তরগুলি জটিল বা জটিল বা প্রতিটি অনুরোধে কিছু ভেরিয়েবল সেট করা দরকার যা আমরা ডিআরওয়াই ধারণাটি জানলে খুব ভুল অনুশীলন। এখানে সাধারণ ইন্টারসেপ্টারের উদাহরণ হিসাবে, আমি যখন অ্যাজ্যাক্স শুরু হয় তখন আমি ওয়েটে মাউস সেট করি এবং এজাক্স শেষ হওয়ার পরে এটি অটোতে সেট করে।

$httpProvider.interceptors.push(function($document) {
    return {
     'request': function(config) {
         // here ajax start
         // here we can for example add some class or show somethin
         $document.find("body").css("cursor","wait");

         return config;
      },

      'response': function(response) {
         // here ajax ends
         //here we should remove classes added on request start

         $document.find("body").css("cursor","auto");

         return response;
      }
    };
  });

কোডটি অ্যাপ্লিকেশন কনফিগারেশনে যুক্ত করতে হবে app.config। আমি লোডিংয়ের স্থিতিতে মাউস কীভাবে পরিবর্তন করব তা দেখিয়েছি কিন্তু সেখানে কোনও লোডার সামগ্রী দেখানো / আড়াল করা, বা কিছু সিএসএস শ্রেণি যুক্ত করা বা অপসারণ করা সম্ভব যা লোডার দেখানো হচ্ছে।

ইন্টারসেপ্টর প্রতিটি এজ্যাক্স কলটিতে চলবে, তাই প্রতিটি এইচপি কলটিতে বিশেষ বুলিয়ান ভেরিয়েবল ($ স্কোপ। লোডিং = সত্য / মিথ্যা ইত্যাদি) তৈরি করার দরকার নেই ।


0

এখানে আমার বাস্তবায়ন, এনজি-শো এবং একটি অনুরোধের কাউন্টার হিসাবে সহজ।

এটি সমস্ত অনুরোধের জন্য $ HTTP- র জন্য একটি নতুন পরিষেবা ব্যবহার করে:

myApp.service('RqstSrv', [ '$http', '$rootScope', function($http, $rootScope) {
    var rqstService = {};

    rqstService.call = function(conf) {

        $rootScope.currentCalls = !isNaN($rootScope.currentCalls) ?  $rootScope.currentCalls++ : 0;

        $http(conf).then(function APICallSucceed(response) {
            // Handle success
        }, function APICallError(response) {
            // Handle error
        }).then(function() {
            $rootScope.currentCalls--;
        });
    }
} ]);

এবং তারপরে আপনি বর্তমান কলগুলির সংখ্যার উপর আপনার লোডার বেসটি ব্যবহার করতে পারেন:

<img data-ng-show="currentCalls > 0" src="images/ajax-loader.gif"/>

0

আপনি যদি প্রতিটি HTTP অনুরোধ কলের জন্য লোডারটি দেখাতে চান তবে আপনি http অনুরোধ কলগুলি পরিচালনা করতে কৌনিক ইন্টারসেপ্টার ব্যবহার করতে পারেন,

এখানে একটি নমুনা কোড

<body data-ng-app="myApp">
<div class="loader">
    <div id="loader"></div>
</div>

<script>
    var app = angular.module("myApp", []);

    app.factory('httpRequestInterceptor', ['$rootScope', '$location', function ($rootScope, $location) {
        return {
            request: function ($config) {
                $('.loader').show();
                return $config;
            },
            response: function ($config) {
                $('.loader').hide();
                return $config;
            },
            responseError: function (response) {
                return response;
            }
        };
    }]);

    app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider',
        function ($stateProvider, $urlRouterProvider, $httpProvider) {
            $httpProvider.interceptors.push('httpRequestInterceptor');
        }]);

</script>
</body>

0

কেবল এনজি-শো এবং একটি বুলিয়ান ব্যবহার করুন

কোনও নির্দেশিকা ব্যবহার করার দরকার নেই, জটিল হওয়ার দরকার নেই।

জমা দেওয়ার বোতামের পাশে বা স্পিনারকে যেখানেই আপনি রাখতে চান এখানে কোড দেওয়ার জন্য:

<span ng-show="dataIsLoading">
  <img src="http://www.nasa.gov/multimedia/videogallery/ajax-loader.gif" style="height:20px;"/>
</span>

এবং তারপরে আপনার নিয়ামকটিতে:

$scope.dataIsLoading = true

let url = '/whatever_Your_URL_Is'
$http.get(url)
.then(function(response) {
  $scope.dataIsLoading = false
})

-1

এখানে আমার সমাধানটি যা আমি খুব সহজেই বোধ করি অন্যরা এখানে পোস্ট করেছেন। যদিও এটি "কতটা সুন্দর" তা নিশ্চিত নয় তবে এটি আমার সমস্ত সমস্যা সমাধান করেছে

আমার কাছে "লোডিং" নামে একটি CSS স্টাইল রয়েছে

.loading { display: none; }

লোডিং ডিভের জন্য এইচটিএমএল যা কিছু হতে পারে তবে আমি সেখানে কিছু ফন্টআউভিজ আইকন এবং স্পিন পদ্ধতি ব্যবহার করেছি:

<div style="text-align:center" ng-class="{ 'loading': !loading }">
    <br />
    <h1><i class="fa fa-refresh fa-spin"></i> Loading data</h1>
</div>

আপনি যে উপাদানগুলিকে আড়াল করতে চান তাতে কেবল এটি লিখুন:

<something ng-class="{ 'loading': loading }" class="loading"></something>

এবং ফাংশন আমি এই চাপ উপর সেট।

(function (angular) {
    function MainController($scope) {
        $scope.loading = true

আমি সিগন্যালআরটি তাই হাবপ্রক্সি.ক্লিয়েন্ট.এললকস ফাংশনে ব্যবহার করছি (যখন এটি লকগুলির মধ্যে দিয়ে যাওয়ার পরে) আমি জাটগুলি রেখেছি

 $scope.loading = false
 $scope.$apply();

পৃষ্ঠাটি লোড হওয়ার পরে এটি লোডের উপর ক্লাশটি স্থাপন করছি এবং অ্যাংুলারজেএস এটি পরে মুছে ফেললে এটি {{কিছু ফিল্ড} hও লুকিয়ে রাখে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.