compiler.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /**
  2. * angular-strap
  3. * @version v2.3.9 - 2016-06-10
  4. * @link http://mgcrea.github.io/angular-strap
  5. * @author Olivier Louvignes <olivier@mg-crea.com> (https://github.com/mgcrea)
  6. * @license MIT License, http://www.opensource.org/licenses/MIT
  7. */
  8. 'use strict';
  9. bsCompilerService.$inject = [ '$q', '$http', '$injector', '$compile', '$controller', '$templateCache' ];
  10. angular.module('mgcrea.ngStrap.core', []).service('$bsCompiler', bsCompilerService);
  11. function bsCompilerService($q, $http, $injector, $compile, $controller, $templateCache) {
  12. this.compile = function(options) {
  13. if (options.template && /\.html$/.test(options.template)) {
  14. console.warn('Deprecated use of `template` option to pass a file. Please use the `templateUrl` option instead.');
  15. options.templateUrl = options.template;
  16. options.template = '';
  17. }
  18. var templateUrl = options.templateUrl;
  19. var template = options.template || '';
  20. var controller = options.controller;
  21. var controllerAs = options.controllerAs;
  22. var resolve = angular.copy(options.resolve || {});
  23. var locals = angular.copy(options.locals || {});
  24. var transformTemplate = options.transformTemplate || angular.identity;
  25. var bindToController = options.bindToController;
  26. angular.forEach(resolve, function(value, key) {
  27. if (angular.isString(value)) {
  28. resolve[key] = $injector.get(value);
  29. } else {
  30. resolve[key] = $injector.invoke(value);
  31. }
  32. });
  33. angular.extend(resolve, locals);
  34. if (template) {
  35. resolve.$template = $q.when(template);
  36. } else if (templateUrl) {
  37. resolve.$template = fetchTemplate(templateUrl);
  38. } else {
  39. throw new Error('Missing `template` / `templateUrl` option.');
  40. }
  41. if (options.titleTemplate) {
  42. resolve.$template = $q.all([ resolve.$template, fetchTemplate(options.titleTemplate) ]).then(function(templates) {
  43. var templateEl = angular.element(templates[0]);
  44. findElement('[ng-bind="title"]', templateEl[0]).removeAttr('ng-bind').html(templates[1]);
  45. return templateEl[0].outerHTML;
  46. });
  47. }
  48. if (options.contentTemplate) {
  49. resolve.$template = $q.all([ resolve.$template, fetchTemplate(options.contentTemplate) ]).then(function(templates) {
  50. var templateEl = angular.element(templates[0]);
  51. var contentEl = findElement('[ng-bind="content"]', templateEl[0]).removeAttr('ng-bind').html(templates[1]);
  52. if (!options.templateUrl) contentEl.next().remove();
  53. return templateEl[0].outerHTML;
  54. });
  55. }
  56. return $q.all(resolve).then(function(locals) {
  57. var template = transformTemplate(locals.$template);
  58. if (options.html) {
  59. template = template.replace(/ng-bind="/gi, 'ng-bind-html="');
  60. }
  61. var element = angular.element('<div>').html(template.trim()).contents();
  62. var linkFn = $compile(element);
  63. return {
  64. locals: locals,
  65. element: element,
  66. link: function link(scope) {
  67. locals.$scope = scope;
  68. if (controller) {
  69. var invokeCtrl = $controller(controller, locals, true);
  70. if (bindToController) {
  71. angular.extend(invokeCtrl.instance, locals);
  72. }
  73. var ctrl = angular.isObject(invokeCtrl) ? invokeCtrl : invokeCtrl();
  74. element.data('$ngControllerController', ctrl);
  75. element.children().data('$ngControllerController', ctrl);
  76. if (controllerAs) {
  77. scope[controllerAs] = ctrl;
  78. }
  79. }
  80. return linkFn.apply(null, arguments);
  81. }
  82. };
  83. });
  84. };
  85. function findElement(query, element) {
  86. return angular.element((element || document).querySelectorAll(query));
  87. }
  88. var fetchPromises = {};
  89. function fetchTemplate(template) {
  90. if (fetchPromises[template]) return fetchPromises[template];
  91. return fetchPromises[template] = $http.get(template, {
  92. cache: $templateCache
  93. }).then(function(res) {
  94. return res.data;
  95. });
  96. }
  97. }