Angular JS——添加依赖于彼此的库
Angular JS - adding libraries depending on each other
我发现这个线程如何在Angular中处理不同加载时间的多个JS库?我用它来添加d3.js到我的头。我现在必须添加d3.legend.js。我该如何以回调的方式完成这一点呢?
var d3js = angular.module('d3', []);
d3js.factory('d3Service', ['$document', '$q', '$rootScope', '$window',
function($document, $q, $rootScope, $window) {
var d = $q.defer();
function onScriptLoad() {
// Load client in the browser
$rootScope.$apply(function() { d.resolve($window.d3); });
}
// Create a script tag with d3 as the source
// and call our onScriptLoad callback when it
// has been loaded
var scriptTag = $document[0].createElement('script');
scriptTag.type = 'text/javascript';
scriptTag.async = true;
scriptTag.src = 'lib/d3.v3.js';
scriptTag.onreadystatechange = function () {
if (this.readyState == 'complete') onScriptLoad();
}
scriptTag.onload = onScriptLoad;
var s = $document[0].getElementsByTagName('body')[0];
s.appendChild(scriptTag);
//this is now where I have to add d3.legend.js which depends on the successful loading of d3.js.
return {
d3: function() { return d.promise; }
};
}]);
原想法的精简版:
var app = angular.module('SomeApp', []);
app.factory('LibraryFactory', function () {
var factory = {};
factory.getD3 = function(callback) {
if(!window.d3) {
var script = document.createElement("script");
script.src = "https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.9/d3.min.js";
document.head.appendChild(script);
script.onload = function() {
callback(window.d3);
};
} else {
callback(window.d3);
}
};
factory.getD3Legend = function(callback) {
if(!window.d3.legend) {
//...ditto
}
};
return factory;
});
并且使用工厂(例如,在控制器中),您可以链接调用:
app.controller('SomeTrialCtrl', function ($scope, LibraryFactory) {
LibraryFactory.getD3(function (d3) {
LibraryFactory.getD3Legend(function (d3WithLegend) {
// place code using the libraries here
});
});
});
在d3的情况下。传说,工厂。getD3函数可以在内部调用getD3函数以使事情更简单。如:
factory.getD3Legend = function(callback) {
factory.getD3(function(d3) {
if(!d3.legend) {
//...ditto
}
callback(d3);
}
};
无论如何这是基本的想法。@aarosil在原始帖子中的回答可能更符合angular。
我只是循环遍历我需要添加的库数组,并逐个添加它们,参见下面的代码:
var _libraries: [
'scripts/d3.min.js',
'scripts/moment.min.js'
]
for (var i = 0, len = _libraries.length; i < len; i++) {
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = _libraries[i];
document.body.appendChild(s);
}
希望这对你有帮助。
相关文章:
- Node.js中依赖于版本的类型继承
- Sails.js日志传输依赖于环境
- 在js中使用节俭而不依赖于节俭RPC
- 如何使 MathJax 的源代码(路径.js环境依赖于
- 如何在维护DRY代码的同时运行依赖于js事件的coffeescript方法
- Rivets.js属性依赖于几个字段
- require.js模块是否可以依赖于它自己
- 如何同步声明JS对象,然后用依赖于并发操作的数据编辑对象的属性
- 加载依赖于页面的面向对象JS属性的最好方法是什么?
- d3.js中单个节点中的复杂符号,其中符号依赖于数据
- 依赖于Backbone.js模型的属性
- Java Nashorn: JS中的抽象类,依赖于JS函数
- 将常见的js代码移到依赖于闭包的函数中
- 如何使用RquireJS加载一个定义了全局变量并依赖于另一个第三方库的JS库
- 使用JS显示依赖于元素类的图像
- Requirejs -将多个文件合并为一个不依赖于Requirejs的js文件
- Angular JS——添加依赖于彼此的库
- 如何激发依赖于2个(或多个)条件的JS事件
- React Native-使用依赖于node.js核心模块的Javascript模块
- node.js事件发射器创建多个对象或依赖于参数