我已經閱讀了有關角$範圍幾個SO反應,以及它如何是一個普通的舊JavaScript對象,這意味着它會跟JS的原型繼承(What are the nuances of scope prototypal/prototypical inheritance in AngularJS?)爲什麼我的Angular ngModel示例不會引發錯誤?
既然是這樣的話,我很好奇,爲什麼我的下面的例子不會拋出一個錯誤:
<!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.data.message。
- 但是,爲了做到這一點,JavaScript中的第一步將嘗試解決$ scope.data。
- 由於MainCtrl函數沒有數據屬性,它將嘗試在rootScope中查找數據屬性。
- 由於rootScope沒有數據屬性,$ scope.data應該解析爲'undefined'。
- 最後,如果您嘗試分配給undefined.message,則會引發錯誤。
但是,代碼愉快地工作和數據綁定正確。有人可以幫助解開爲什麼這不是給我拋出一個錯誤?
把這個作爲一個評論,因爲我敢肯定有更多的技術響應。從我讀過的內容來看,你是正確的,直到拋出錯誤。角色不是試圖分配給undefined.message並拋出錯誤,而是檢測到它是未定義的,並在該範圍上創建它,然後分配該值。 –