[解決済み] コントローラをグローバルに定義しているときに、コントローラが関数ではなく、未定義になりました。
質問
angularjsを使ってサンプルアプリケーションを書いているのですが、chromeブラウザで以下のようなエラーが発生しました。
エラーは
<ブロッククオートエラーです。[ng:areq]です。 http://errors.angularjs.org/1.3.0-beta.17/ng/areq?p0=ContactController&p1=not%20a%20function%2C%20got%20undefined
これは次のようにレンダリングされます。
引数 'ContactController' は関数ではありません、未定義です。
コード
<!DOCTYPE html>
<html ng-app>
<head>
<script src="../angular.min.js"></script>
<script type="text/javascript">
function ContactController($scope) {
$scope.contacts = ["[email protected]", "[email protected]"];
$scope.add = function() {
$scope.contacts.push($scope.newcontact);
$scope.newcontact = "";
};
}
</script>
</head>
<body>
<h1> modules sample </h1>
<div ng-controller="ContactController">
Email:<input type="text" ng-model="newcontact">
<button ng-click="add()">Add</button>
<h2> Contacts </h2>
<ul>
<li ng-repeat="contact in contacts"> {{contact}} </li>
</ul>
</div>
</body>
</html>
解決方法は?
Angular 1.3+では、グローバルコントローラ宣言をグローバルスコープで使用できなくなりました(明示的な登録がない場合)。コントローラを登録するには
module.controller
の構文があります。
例:-)
angular.module('app', [])
.controller('ContactController', ['$scope', function ContactController($scope) {
$scope.contacts = ["[email protected]", "[email protected]"];
$scope.add = function() {
$scope.contacts.push($scope.newcontact);
$scope.newcontact = "";
};
}]);
または
function ContactController($scope) {
$scope.contacts = ["[email protected]", "[email protected]"];
$scope.add = function() {
$scope.contacts.push($scope.newcontact);
$scope.newcontact = "";
};
}
ContactController.$inject = ['$scope'];
angular.module('app', []).controller('ContactController', ContactController);
破格の変更ですが
を使用することで、グローバルを使用しないようにすることができます。
allowGlobals
.
例:-)
angular.module('app')
.config(['$controllerProvider', function($controllerProvider) {
$controllerProvider.allowGlobals();
}]);
以下はAngularのソースからのコメントです:-。
<ブロッククオート-
で指定された名前のコントローラが登録されているかどうか確認します。
$controllerProvider
- 現在のスコープで文字列を評価すると、コンストラクタが返されるかどうかをチェックします。
-
もし $controllerProvider#allowGlobals ならば、次のようにチェックします。
window[constructor]
グローバルなwindow
オブジェクトを作成します (推奨しません)。
.....
expression = controllers.hasOwnProperty(constructor)
? controllers[constructor]
: getter(locals.$scope, constructor, true) ||
(globals ? getter($window, constructor, true) : undefined);
いくつかの追加チェック:-)
-
アプリ名を
ng-app
ディレクティブを使用します。html
を使用することもできます。例: - ng-app="myApp" -
すべてがうまくいっているにもかかわらず、問題が発生する場合は、スクリプトに正しいファイルが含まれているかどうかを確認することを忘れないでください。
-
同じモジュールを別の場所で2回定義していませんか?その結果、同じモジュールで以前に定義されたエンティティがクリアされます。
angular.module('app',[]).controller(..
そしてまた別の場所でangular.module('app',[]).service(..
(もちろん両方のスクリプトが含まれています) は、以前に登録されたコントローラをモジュールのapp
は、2回目のモジュールの再作成でクリアされます。
関連
-
[解決済み】TypeError: $(...).DataTable は関数ではありません。
-
[解決済み] Uncaught TypeError: 未定義のプロパティ 'top' を読み込めない
-
[解決済み】Angular JS Uncaught Error。[インジェクター:モジュラー]。
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】NodeJS "ESモジュールをロードするためにインポートを使用する必要があります。"
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】Vueが定義されていない
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: $(...).DataTable は関数ではありません。
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み】Angular JS Uncaught Error。[インジェクター:モジュラー]。
-
[解決済み】webpack-dev-serverにリモート接続すると、「Invalid Host header」というメッセージが表示されます。
-
[解決済み】JavaScriptのgetElementByNameが機能しない
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み】WebSocket接続に失敗しました。WebSocket のハンドシェイク中にエラーが発生しました。予期しない応答コードです。400
-
[解決済み】SyntaxError: 期待された式が、'<'を得た。
-
[解決済み】TypeError: AngularJSで未定義のプロパティ'get'を読み取れない