Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';我的模型示例不会抛出错误吗?_Javascript_Angularjs_Angularjs Scope_Angular Ngmodel - Fatal编程技术网

Javascript 为什么';我的模型示例不会抛出错误吗?

Javascript 为什么';我的模型示例不会抛出错误吗?,javascript,angularjs,angularjs-scope,angular-ngmodel,Javascript,Angularjs,Angularjs Scope,Angular Ngmodel,我读过一些关于Angular$scope的回复,以及它是一个普通的老JavaScript对象,这意味着它将遵循JS的原型继承() 既然如此,我很好奇为什么下面的示例没有抛出错误: <!doctype html> <html ng-app='MyApp'> <head> <meta charset='utf-8'> <title>Egghead</title> <script src='https://aja

我读过一些关于Angular$scope的回复,以及它是一个普通的老JavaScript对象,这意味着它将遵循JS的原型继承()

既然如此,我很好奇为什么下面的示例没有抛出错误:

<!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>

书呆子
var-app=angular.module('MyApp',[]);
app.controller('MainCtrl',['$scope',函数($scope){
}])
{{data.message}

基于原型遗传,以下是我希望发生的事情:

  • 调用MainCtrl时,它将为MainCtrl及其相应视图创建$scope对象
  • 每当您在输入框中键入时,它都会将一些字符串绑定到$scope.data.message
  • 然而,为了做到这一点,JavaScript中的第一步将是尝试解析$scope.data
  • 由于MainCtrl函数没有数据属性,它将尝试在rootScope中查找数据属性
  • 由于rootScope没有数据属性,$scope.data应解析为“未定义”
  • 最后,如果您试图分配给undefined.message,这将抛出一个错误

  • 但是,代码运行良好,数据绑定正确。有人能帮我解开为什么这不会给我带来错误吗?

    为什么它不会失败,我的意思是
    ngModel
    ,因为它是一个双向数据绑定指令。你可以在另一篇文章中阅读更多关于这方面的内容:


    但解释这种行为的更简单的方法是,如果变量在
    ngModel
    中使用,即使它不存在,也将其声明为作用域的一部分。

    发表了我的原始评论,因为我不是100%,但在检查文档后,这是因为

    ngModel将尝试通过计算当前作用域上的表达式来绑定到给定的属性。如果该属性在此作用域上不存在,则将隐式创建该属性并将其添加到作用域中

    因此,如果该属性不存在,它将在指定值时创建


    src:

    将此作为评论,因为我确信会有更技术性的回应。从我所读到的,直到抛出错误为止,你都是正确的。angular没有尝试分配给undefined.message并抛出错误,而是检测到它未定义,并在作用域上创建它,然后分配值。感谢您将我指回到文档!这就解释了这一点,但接下来的问题是,“data”属性是分配给MainCtrl的$scope对象还是rootScope对象。我不确定的原因是,Angular似乎正在范围链上行走,它处理的最后一个范围对象似乎是rootScope对象。数据将绑定到您所在控制器的范围,因此在本例中,MainCtrl。我这么说是因为文档说“通过计算当前作用域上的表达式”,然后又说“如果该属性在此作用域上不存在”,所以这是指当前作用域,它不是$rootScope,而是mainCtrl作用域。谢谢Tyler的帮助!