需求是在調用某個封裝了第三方插件的directive時再加載該插件相關的js
文件,實現按需加載,但不用requireJS
。
我的初期想法是,在directive
的link
函數中利用jquery
動態加載相關js
文件,但是這樣不知道文件加載完成的時間。
相關程式碼如下(以封裝select2
為例)
<p ng-app="app" ng-controller="FooController as vm">
<select my-select2 ng-model="vm.selector">
<option value="aaaa">aaaaa</option>
<option value="bbbb">bbbbb</option>
<option value="cccc">ccccc</option>
</select>
<p ng-bind="vm.selector"></p>
</p>
var app = angular.module('app', []);
app.controller('FooController', function() {
var vm = this;
});
//自定义指令,简单封装select2, 这里只是以select2为例
app.directive('mySelect2', function($timeout) {
return {
link: function(scope, ele, attr) {
//目前的想法是在这儿用jq动态加入script标签导入select2源文件
//但是文件是异步加载的,无法知道什么时候加载完
$('body').append('<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></sc'+'ript>');
//现在用timeout等select2加载好,模拟出应该实现的效果 **求各位给个正确的方案**
$timeout(function() {
$(ele).select2(); //主要为了元素可以调用这个方法,这是select2插件的初始化方法
}, 3000);
}
};
});
codepen連結
angularJS
中到底該怎麼實現局部按需加載?
好吧,答案就是ocLazyLoad,以下是修改之後的部分代碼.
ps: 原理是不是利用ajax異步請求目標js文件,然後在回調函數中,將請求到的文本放入script標籤,加入dom,然後進行插件相關的呼叫?
app.directive('mySelect2', function($timeout, $ocLazyLoad) {
return {
link: function(scope, ele, attr) {
ele.hide();
$ocLazyLoad.load(['https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css'])
.then(function() {
$(ele).select2();
});
}
};
});