我們目前正在使用Phonegap調查iPad的兒童應用程序的AngularJS。有CreateJS構建的活動和小遊戲。我們希望在用戶在菜單中選擇它們時動態地包含這些遊戲或活動。 我將如何加載角模板中的遊戲相關JS文件? ng-include在這裏有幫助嗎?動態加載一個角度的應用程序中的JS文件
回答
我的第一個直覺就是建議ng-view
併爲你想要的各種遊戲創建路線$routeProvider
。下面是改編自角文檔快速片段(V1.1.5):
angular.module('ngView', [], function($routeProvider, $locationProvider) {
$routeProvider.when('/Game1', {
templateUrl: 'Game1.html',
controller: Game1Cntl,
controllerAs: 'game1'
});
$routeProvider.when('/Game2', {
templateUrl: 'Game2.html',
controller: Game2Cntl,
controllerAs: 'game2'
});
// configure html5 to get links working on jsfiddle
$locationProvider.html5Mode(true);
});
雖然通過templateUrl
指定的內容將按需加載,這還是假設你的控制器,在這個例子中Game1Cntl
和Game2Cntl
,在用戶訪問菜單以更改應用程序中的路線之前已經加載。
如果您決定還需要根據需要自行加載控制器,則可以採用的一種方法是使用$routeProvider
的resolve
選項。這是爲了在實例化控制器之前將值注入控制器。但是,您可以使用它來延遲加載控制器本身。
$routeProvider.when('/Game1', {
templateUrl: 'Game1.html',
controller: Game1Cntl,
controllerAs: 'game1',
resolve: {
dynamicallyLoadedController: functionThatReturnsAPromise
}
});
這裏functionThatReturnsAPromise
可能是這樣的:
function getAController($q) {
var deferred = $q.defer();
$.ajax({
url: '/where/ever/your/controller/script/is.js',
dataType: "script",
success: function(script, status, jqXHR) {
// make your script available to angular
// angular will find it on the global window object but that's not real tidy
deferred.resolve(script); // at this point angular can proceed with the route
}
});
// TODO: you'd want to handle errors and reject the promise here
// in a real implementation
return deferred.promise;
}
getAController.$inject = ['$q']; // for when script is minified
這裏getAController()
被使用jQuery下載並執行動態加載腳本。它也被注入角度的$q
來創造一個承諾。
注意違背resolve
選項,這是注入在控制器的值這種方法只是利用了這一事實,我們可以返回一個承諾這給了我們一個異步的機會,懶負荷控制器的意願(或潛在其他服務,指令等)。我們在這裏解決諾言實際上並不是這種情況下的重點。也許現在或將來會有更優雅的方式來解決這個問題。
+1使這個答案非常完整。 但是,如果可以在routeprovider映射中定義URL,這將會很有幫助。爲每個控制器製作一個功能並不是很整潔。 – yash101
基於它我創建了一個服務,JSLoader。在這裏檢查https://github.com/farazshuja/JSLoader – FarazShuja
var controllerProvider;
var app = angular.module('myApp', []);
app.config(function($controllerProvider) {
controllerProvider = $controllerProvider; //cache this reference
});
function myCtrl($scope) { //this controller can be loaded by ajax
//etc
}
//then register it with Angular like this
controllerProvider.register('myCtrl', myCtrl);
使用此邏輯,您可以輕鬆地將控制器和指令延遲加載到Angular中。對於更多的細節和現場演示,看到這些帖子:
基本演示:Directive for lazyloading data in AngularJS
真實生活中的例子(高級):Lazy loading Angular views and controllers on page scroll
- 1. 動態加載整個角度的應用程序
- 2. 如何從另一個角度爲2的應用程序加載一個角度爲2的應用程序?
- 3. 角度加載json文件動態onclick
- 4. 動態加載電子應用中的角度組件
- 5. 如何在我的應用程序中動態加載JS文件?
- 6. 啓動一個角度應用程序
- 7. 應該下載哪個eclispe來自動化角度js應用程序
- 8. 從一個文件加載所有URL或一個文件加載Google App Engine應用程序加載速度
- 9. 以角度動態加載js腳本或js代碼
- 10. 角度js在應用程序啓動後再次加載路由器
- 11. 使用requireJS動態加載js文件
- 12. 在ajax中動態加載js文件
- 13. 在Windows 8應用程序中動態加載CSS文件
- 14. 用js製作一個角度應用程序書籤
- 15. 添加角色號碼錶使用動態的角度JS
- 16. 如何從角度2中加載另一個js文件中的js文件 - webpack
- 17. 預編譯的角度JS模板,以加快應用程序的啓動
- 18. 組件加載角度時的加載程序gif 2
- 19. 角度2應用程序組件不加載
- 20. 瀏覽器不加載角度應用程序組件
- 21. camerapreview插件找不到我的角度js應用程序
- 22. 動態加載AngularJS應用程序
- 23. 在rails應用程序中更改dom後加載js文件
- 24. 從應用程序中加載js文件django-cms
- 25. 如何使一個動態加載的插件Web應用程序感知
- 26. 角動態組件加載
- 27. 我的json文件不加載角js?
- 28. 在React應用程序中加載JS
- 29. 角度js應用程序中的Windows用戶名
- 30. 如何動態加載Js文件?
IDK的爲什麼這是downvoted。我不能在這個問題上嗅到任何錯誤。 – yash101