ui-load.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. 'use strict';
  2. /**
  3. * 0.1.1
  4. * Deferred load js/css file, used for ui-jq.js and Lazy Loading.
  5. *
  6. * @ flatfull.com All Rights Reserved.
  7. * Author url: #user/flatfull
  8. */
  9. angular.module('ui.load', [])
  10. .service('uiLoad', ['$document', '$q', '$timeout', function ($document, $q, $timeout) {
  11. var loaded = [];
  12. var promise = false;
  13. var deferred = $q.defer();
  14. /**
  15. * Chain loads the given sources
  16. * @param srcs array, script or css
  17. * @returns {*} Promise that will be resolved once the sources has been loaded.
  18. */
  19. this.load = function (srcs) {
  20. srcs = angular.isArray(srcs) ? srcs : srcs.split(/\s+/);
  21. var self = this;
  22. if(!promise){
  23. promise = deferred.promise;
  24. }
  25. angular.forEach(srcs, function(src) {
  26. promise = promise.then( function(){
  27. return src.indexOf('.css') >=0 ? self.loadCSS(src) : self.loadScript(src);
  28. } );
  29. });
  30. deferred.resolve();
  31. return promise;
  32. }
  33. /**
  34. * Dynamically loads the given script
  35. * @param src The url of the script to load dynamically
  36. * @returns {*} Promise that will be resolved once the script has been loaded.
  37. */
  38. this.loadScript = function (src) {
  39. if(loaded[src]) return loaded[src].promise;
  40. var deferred = $q.defer();
  41. var script = $document[0].createElement('script');
  42. script.src = src;
  43. script.onload = function (e) {
  44. $timeout(function () {
  45. deferred.resolve(e);
  46. });
  47. };
  48. script.onerror = function (e) {
  49. $timeout(function () {
  50. deferred.reject(e);
  51. });
  52. };
  53. $document[0].body.appendChild(script);
  54. loaded[src] = deferred;
  55. return deferred.promise;
  56. };
  57. /**
  58. * Dynamically loads the given CSS file
  59. * @param href The url of the CSS to load dynamically
  60. * @returns {*} Promise that will be resolved once the CSS file has been loaded.
  61. */
  62. this.loadCSS = function (href) {
  63. if(loaded[href]) return loaded[href].promise;
  64. var deferred = $q.defer();
  65. var style = $document[0].createElement('link');
  66. style.rel = 'stylesheet';
  67. style.type = 'text/css';
  68. style.href = href;
  69. style.onload = function (e) {
  70. $timeout(function () {
  71. deferred.resolve(e);
  72. });
  73. };
  74. style.onerror = function (e) {
  75. $timeout(function () {
  76. deferred.reject(e);
  77. });
  78. };
  79. $document[0].head.appendChild(style);
  80. loaded[href] = deferred;
  81. return deferred.promise;
  82. };
  83. }]);