[英]Can I link an external javascript file to an AngularJS controller?
這可能是一個愚蠢的問題。 我知道AngularJS控制器使用javascript代碼將應用程序邏輯保持在視圖之外。 但我想知道我是否可以將外部javascript文件鏈接到控制器,所以它不必太長。
如果有可能你也會分享我將如何做的語法。 就像是:
app.controller('demoCtrl', ['$scope', function ($scope) {
$scope.msgtxt='Hello World';
src=somejavascriptfile.js;
}]);
如果您的問題是控制器邏輯太長,那么您是正確的,這是代碼味道。 您希望使控制器盡可能地薄,只需足夠的邏輯來處理視圖事件和更新模型(范圍)。 如果要重構控制器代碼,第一步是將邏輯提取到服務中(在角度語言提供者/工廠/服務中)。 然后可以將服務注入到控制器中,類似於注入$scope
服務的方式。
閱讀此sitepoint文章 ,了解有關如何執行此操作的詳細信息。
下一步可能是尋找可以提取到指令中的邏輯(主要是UI相關)。
如果您需要在角度應用程序中使用外部JavaScript庫,最佳方法是將該腳本添加到html文件的scripts部分,並將功能包裝在服務或指令中(如果它與UI相關)。 確保檢查是否有可用於要引入的第三方庫的角度模塊。
您不僅可以分割你的控制器代碼不同的文件中,但你可能應該這樣做。 角度控制器負責視圖背后的業務邏輯,僅用於此。 如果在控制器內部,你是錯誤的(列出並不詳盡):
您的組件應簡明扼要,並且應承擔單一責任 。
下面是一個如何在服務中導出代碼的一部分的示例。 您沒有鏈接控制器中的js文件,但是將其加載到頁面中,並將服務作為控制器的參數注入:
1)在index.html中加載您的服務:
<script src="js/factories/loggerService.js"></script>
2)在loggerService.js中實現您的服務
app.factories('loggerService', function () {
//
// Implement here some logging methods
//
// IMPORTANT: do not bloat this service with methods not related
// with logging
//
});
3)在您的控制器中注入您的服務:
app.controller('demoCtrl', function ($scope, loggerService) {
loggerService.info(...)
});
順便說一句,只有當您需要與angular內置服務$log
提供的服務不同的東西時,此loggerService
才有用
在另一個文件中,定義包含邏輯的服務,並從控制器中調用它。
app.controller('demoCtrl', ['$scope', function (ServiceFromDifferentFile, $scope) {
$scope.msgtxt='Hello World';
ServiceFromDifferentFile.doStuff()
}]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.