【发布时间】:2014-06-05 02:00:32
【问题描述】:
我已经阅读了一些关于 Angular $scope 的 SO 响应以及它是如何成为一个普通的旧 JavaScript 对象的,这意味着它将遵循 JS 的原型继承 (What are the nuances of scope prototypal / prototypical inheritance in 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,这应该会引发错误。
但是,代码可以正常工作并且数据已正确绑定。有人可以帮助解开为什么这不会给我带来错误吗?
【问题讨论】:
-
将此作为评论留下,因为我确信会有更多技术响应。从我读过的内容来看,直到抛出错误为止,您都是正确的。 Angular 没有尝试分配给 undefined.message 并抛出错误,而是检测到它是未定义的并在范围内创建它,然后分配值。
标签: javascript angularjs angularjs-scope angular-ngmodel