Angular $scope に関するいくつかの SO 応答を読みました。これは、JS のプロトタイプ継承に従うことを意味します ( AngularJS におけるスコープ プロトタイプ/プロトタイプ継承のニュアンスは何ですか? ) 。
これが事実であるため、次の例がエラーをスローしない理由に興味があります。
<!doctype html>
<html ng-app='MyApp'>
<head>
<meta charset='utf-8'>
<title>Egghead</title>
<script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js'></script>
<script>
var app = angular.module('MyApp', []);
app.controller('MainCtrl', ['$scope', function ($scope) {
}])
</script>
</head>
<body>
<div ng-controller='MainCtrl'>
<input type='text' ng-model='data.message'>
<p>{{ data.message }}</p>
</div>
</body>
</html>
プロトタイプの継承に基づいて、私が期待することは次のとおりです。
- MainCtrl が呼び出されると、MainCtrl とそれに対応するビューの $scope オブジェクトが作成されます。
- 入力ボックスに入力するたびに、何らかの文字列が $scope.data.message にバインドされます。
- ただし、これを行うために、JavaScript での最初のステップは、$scope.data の解決を試みることです。
- MainCtrl 関数にはデータ プロパティがないため、rootScope でデータ プロパティを検索しようとします。
- rootScope にはデータ プロパティがないため、$scope.data は「未定義」に解決されるはずです。
- 最後に、undefined.message に代入しようとすると、エラーが発生するはずです。
ただし、コードは問題なく機能し、データは正しくバインドされています。なぜこれが私にエラーを投げていないのか、誰かが解決するのを助けることができますか?