如何使用AngularJS来加载非角度的JavaScript文件?

前端之家收集整理的这篇文章主要介绍了如何使用AngularJS来加载非角度的JavaScript文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以从Angular Controller加载简单的旧的JS或AMD模块?以前我已经用过RequireJS了.

之前我已经在一个相当大的项目中使用了AngularJS和RequireJS.我正在基于MEAN Stack种子开发一个新项目,而不使用requireJS.

我不完全清楚,但Angular有一个加载模块的系统 – 我可以从我的角度控制器中加载一个特定的javascript吗?

有没有办法修改我的module()声明来添加额外的常规javascript文件

谢谢!

编辑:为了对我在做什么有一点了解,我有一个页面编辑了几种不同的形式.这些都作为一个“表单”保存到我的数据库中.根据表单的类型,不同的字典值映射到不同子视图中的不同字段.我的一些表单有下拉菜单或输入列表.这些是不同的,但是关于“形式”的一切都是以通用的方式处理的.

所以我有这个单一的形式控制器来处理一堆不同的形式,我对结果非常满意.主要问题来自于每个表单都有一组单独的数据,我想避免加载,除非我需要.

我可以通过检查驱动我的ng-include(加载子表单)的下拉菜单来检查加载的形式.

在短期内,我刚刚加载了所有内容,并在我的范围内创建了命名空间来进行区分.

例如$scope.form1和$scope.form2,用于特定于特定表单的数据/规则.我只是尽快不加载我不需要的js.

编辑2:
http://jsfiddle.net/HB7LU/1320/

  1. function MyCtrl($scope) {
  2. $scope.doSomething = function()
  3. {
  4. //I'm used to wrapping with e.g require('jquery..... here,can I do the same thing with angular?
  5. alert(" I need to run a jquery function here...");
  6. var xml = $(someblock);
  7. };
  8. }

我已经把我正在谈论的小提琴放在一起了.我想加载任意JS,根据我的控制器中的某些路径,只有当我需要它们.

基本上,我有一些较大的命名空间,我想要加载取决于许多选择之一选择,这将是昂贵的,只是加载它们全部.

好的,我评论了我的代码,以便它应该解释一切.如果还有其他问题,请告知我.这是您的意见中进一步解释的问题的解决方案. Live demo here (click).

标记

  1. <!DOCTYPE html>
  2. <html ng-app="myApp" ng-controller="myCtrl">
  3. <head>
  4. </head>
  5. <body>
  6.  
  7. <button ng-click="load()">Load Foo</button>
  8. <!-- I'm using this to bootstrap the lazy loaded script -->
  9. <section ng-repeat="item in loaded" lazy="item"></section>
  10.  
  11. <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
  12. <script src="script.js"></script>
  13. </body>
  14. </html>

JavaScript的:

  1. var app = angular.module('myApp',[]);
  2.  
  3. app.controller('myCtrl',function($scope) {
  4. //array of things to load
  5. $scope.lazyThings = [
  6. {directive:'my-foo-directive',file:'foo.js'}
  7. ];
  8. $scope.loaded = [];
  9. $scope.load = function() {
  10. var loadIndex = $scope.loaded.length;
  11. if ($scope.lazyThings[loadIndex]) {
  12. $scope.loaded.push($scope.lazyThings[loadIndex]);
  13. }
  14. }
  15. });
  16.  
  17. app.factory('myService',function($http) {
  18. return {
  19. getJs: function(path) {
  20.  
  21. return $http.get(path).then(function(response) {
  22. deferred.resolve(response.data);
  23. });
  24.  
  25. }
  26. }
  27. });
  28.  
  29. //this adds an attribute to kick off the directive
  30. //for whatever script was lazy loaded
  31. app.directive('lazy',function($compile,$q,myService) {
  32. var directiveReturn = {
  33. restrict: 'A',scope: {
  34. lazy: '='
  35. },link: function(scope,element) {
  36. myService.getJs(scope.lazy.file).then(function(data) {
  37. return addScript(scope.lazy.file,data,scope);
  38. }).then(function() {
  39. var $span = angular.element('<span></span>').attr(scope.lazy.directive,'');
  40. $compile($span)(scope);
  41. element.append($span);
  42. });
  43. }
  44. }
  45.  
  46. var scriptPromises = {};
  47. function addScript(file,js,scope) {
  48. if (!scriptPromises[file]) { //if this controller hasn't already been loaded
  49. var deferred = $q.defer();
  50. //cache promise)
  51. scriptPromises[file] = deferred.promise;
  52.  
  53. //inject js into a script tag
  54. var script = document.createElement('script');
  55. script.src = 'data:text/javascript,' + encodeURI(js);
  56. script.onload = function() {
  57. //now the script is ready for use,resolve promise to add the script's directive element
  58. scope.$apply(deferred.resolve());
  59. };
  60. document.body.appendChild(script);
  61. return deferred.promise;
  62. }
  63. else { //this script has been loaded before
  64. return scriptPromises[loadFile]; //return the resolved promise from cache
  65. }
  66. }
  67.  
  68. return directiveReturn;
  69. });
  70.  
  71. app.directive('myFooDirective',function() {
  72. return {
  73. restrict: 'A',element) {
  74. //put the logic from your lazy loaded "foo.js" script here
  75. element.text(foo.someFunction());
  76. }
  77. }
  78. });

示例懒加载脚本:

  1. var foo = {
  2. someFunction: function() {
  3. return 'I am data from a lazy loaded js function!';
  4. }
  5. };

有很多方法可以实现我在这里展示的概念.想想如何使用它,并写一些指令来执行它.角度使大多数事情很简单.

注意:注入脚本标记是可选的 – 但我非常喜欢直接执行脚本.使用脚本标签时,您可以使用“脚本”部分“资源”下的开发工具来跟踪所有加载的文件.

猜你在找的Angularjs相关文章