AngularJSコントローラはすべて1つのファイルcontrollers.jsに収められています。このファイルは次のように構成されています。
angular.module('myApp.controllers', [])
.controller('Ctrl1', ['$scope', '$http', function($scope, $http) {
}])
.controller('Ctrl2', ['$scope', '$http', function($scope, $http) }
}])
私がやりたいことはCtrl1とCtrl2を別々のファイルに入れることです。次に両方のファイルを私のindex.htmlに含めますが、それはどのように構成されるべきですか?私はこのようなことをやろうとしました、そしてそれはそれが私のコントローラを見つけることができないと言うウェブブラウザコンソールでエラーを投げます。何かヒントは?
私はStackOverflowを検索し、この同じような質問を見つけました - しかし、この構文はAngularの上に異なるフレームワーク(CoffeeScript)を使っているので、私は従うことができませんでした。
ファイル1
angular.module('myApp.controllers', []);
ファイル2
angular.module('myApp.controllers').controller('Ctrl1', ['$scope', '$http', function($scope, $http){
}]);
ファイル3:
angular.module('myApp.controllers').controller('Ctrl2', ['$scope', '$http', function($scope, $http){
}]);
その順序で含めてください。私は3つのファイルをお勧めしますので、モジュール宣言はそれ自身のものです。
フォルダ構造に関しては、この件に関する多くの意見がたくさんありますが、この二つはかなり良いです
Angular.module APIを使用して 最後に配列を指定して は、新しいモジュールを作成するようにangleに指示します。
myApp.js
// It is like saying "create a new module"
angular.module('myApp.controllers', []); // Notice the empty array at the end here
配列なしでそれを使うことは、実際にはゲッター関数です。コントローラを切り離すために、次のことができます。
Ctrl1.js
// It is just like saying "get this module and create a controller"
angular.module('myApp.controllers').controller('Ctrlr1', ['$scope', '$http', function($scope, $http) {}]);
Ctrl2.js
angular.module('myApp.controllers').controller('Ctrlr2', ['$scope', '$http', function($scope, $http) {}]);
JavaScriptのインポート中は、 myApp.js がAngularJSの後、コントローラ/サービスなどの前にあることを確認してください。
両方の答えは技術的には正しいですが、私はこの答えに対して異なる構文の選択を紹介したいと思います。このimhoは、注射で何が起こっているのかを読みやすくしたり、区別したりします。
ファイルワン
// Create the module that deals with controllers
angular.module('myApp.controllers', []);
ファイル2
// Here we get the module we created in file one
angular.module('myApp.controllers')
// We are adding a function called Ctrl1
// to the module we got in the line above
.controller('Ctrl1', Ctrl1);
// Inject my dependencies
Ctrl1.$inject = ['$scope', '$http'];
// Now create our controller function with all necessary logic
function Ctrl1($scope, $http) {
// Logic here
}
ファイル3
// Here we get the module we created in file one
angular.module('myApp.controllers')
// We are adding a function called Ctrl2
// to the module we got in the line above
.controller('Ctrl2', Ctrl2);
// Inject my dependencies
Ctrl2.$inject = ['$scope', '$http'];
// Now create our controller function with all necessary logic
function Ctrl2($scope, $http) {
// Logic here
}
この解決策はどうですか? ファイル内のモジュールとコントローラ (ページの最後にあります)複数のコントローラ、ディレクティブなどで動作します。
app.js
var app = angular.module("myApp", ['deps']);
myCtrl.js
app.controller("myCtrl", function($scope) { ..});
html
<script src="app.js"></script>
<script src="myCtrl.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">
Googleには Angular App Structureの推奨されるベストプラクティスの推奨事項もあります コンテキスト別にグループ化することをお勧めします。 1つのフォルダ内のすべてのHTMLファイルではなく、たとえばログイン用のすべてのファイル(html、css、app.js、controller.jsなど)。だから私がモジュールで作業しているなら、すべてのディレクティブは見つけやすいです。
簡潔にするために、グローバル変数に依存しないES2015のサンプルを次に示します。
// controllers/example-controller.js
export const ExampleControllerName = "ExampleController"
export const ExampleController = ($scope) => {
// something...
}
// controllers/another-controller.js
export const AnotherControllerName = "AnotherController"
export const AnotherController = ($scope) => {
// functionality...
}
// app.js
import angular from "angular";
import {
ExampleControllerName,
ExampleController
} = "./controllers/example-controller";
import {
AnotherControllerName,
AnotherController
} = "./controllers/another-controller";
angular.module("myApp", [/* deps */])
.controller(ExampleControllerName, ExampleController)
.controller(AnotherControllerName, AnotherController)
それほど優雅ではありませんが、非常に単純な実装ソリューション - グローバル変数を使用.
"最初の"ファイルでは:
window.myApp = angular.module("myApp", [])
....
"2番目"、 "3番目"などにあります。
myApp.controller('MyController', function($scope) {
....
});