AngularJS-不同的行为取决于我第一次输入的内容
AngularJS - different behaviours depending on in which input first I typed
这是我从本教程中获得的:
http://egghead.io/lessons/angularjs-the-dot
<!DOCTYPE html>
<html>
<head>
<title>AngularJS Tutorials</title>
<link rel="stylesheet" href="vendor/foundation/foundation.min.css">
</head>
<body>
<div ng-app="">
<input type="text" ng-model="data.message">
<h1>{{data.message}}</h1>
<div ng-controller="FirstCtrl">
<input type="text" ng-model="data.message">
<h1>{{data.message}}</h1>
</div>
<div ng-controller="SecondCtrl">
<input type="text" ng-model="data.message">
<h1>{{data.message}}</h1>
</div>
</div>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.3/angular.min.js"></script>
<script type="text/javascript" src="main.js"></script>
</body>
</html>
Main.js
function FirstCtrl($scope){
}
function SecondCtrl($scope){
}
现在加载页面。若我尝试在第一个输入字段中输入数据,它会更新所有h1标记和其他输入字段。在第二个或第三个输入字段中输入数据时也会发生同样的情况。
现在,如果我们刷新页面并首先在第二个输入字段中输入数据则它只更新第二个h1标签。我不喜欢——同一个代码的不同结果。为什么这取决于用户的行为,他首先做了什么?这可能会导致很多错误。
这是因为变量data
没有在作用域中的任何地方定义,而是在您第一次编辑它的最顶端作用域中创建的。
对比一下这个例子:http://plnkr.co/edit/mqtPaMsH2xVMJaW3mEkX?p=preview
这里的控制器是:
function FirstCtrl($scope){
}
function SecondCtrl($scope){
}
function RootCtrl($scope) {
$scope.data = {};
}
模板是:
<div ng-controller="RootCtrl">
<input type="text" ng-model="data.message" />
<h1>{{data.message}}</h1>
<div ng-controller="FirstCtrl">
<input type="text" ng-model="data.message" />
<h1>{{data.message}}</h1>
</div>
<div ng-controller="SecondCtrl">
<input type="text" ng-model="data.message" />
<h1>{{data.message}}</h1>
</div>
</div>
这里,由于我在最上面的作用域上显式定义了data
变量,因此它不再在FirstCtrl
或SecondCtrl
的作用域中创建。但是,如果我省略了RootCtrl
上的定义$scope.data = {}
,它将在需要定义的最顶层作用域上创建,而不一定在RootCtrl
的作用域上。如果您在RootCtrl
的作用域上编辑data.message
,它将被任何没有它的作用域重新创建和继承。
查看GitHub上的开发人员指南,了解有关范围继承的更详细解释。在控制器之间。
这是作用域继承行为。当angular遇到ng控制器时,它将创建一个新范围,继承自当前范围。
在您的示例中,有FirstCtrl的范围和SecondCtrl的范围,它们都继承自rootScope,并且彼此隔离。
如果我尝试在第一个输入字段中输入数据,它会更新所有h1标记以及其他输入字段。
在这种情况下,它将在rootScope上创建/更新data.message(因为它不在ng控制器内),这是由FirstCtrl的作用域和SecondCtrl的作用区继承的,因为在您的代码中,data.message不存在于FirstCtrl和SecondCtrl的范围中。
现在,如果我们刷新页面并首先在第二个输入字段中输入数据则它只更新第二个h1标签。
在这种情况下,它将在FirstCtrl的作用域上创建/更新data.message。rootScope和SecondCtrl的scope不知道此更新。
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- 删除确认对话框在第一次单击时不起作用
- jQuery表单验证(如果==“执行此操作”)仅适用于第一次输入
- AngularJS-不同的行为取决于我第一次输入的内容
- 为什么输入会在第一次单击时触发(仅限)
- 如何第一次清除焦点上的输入
- 自动完成未在第一次输入时启动
- Angularjs只在第一次选择时触发输入电台的ng更改
- 禁用输入键盘3秒后,第一次按下并重新启用输入键盘再次
- js根据第一次输入设置焦点
- 谷歌地图建议.根据第一次输入筛选建议
- 在Safari中,第一次对输入调用.focus()会延迟
- 如何阻止表单输入在第一次单击时注册为无效
- 动态添加到表单的输入在第一次验证后不验证
- 如果没有输入,禁用搜索按钮,如果页面第一次加载,隐藏搜索表
- 悬停事件在第一次调用鼠标时停止鼠标输入事件
- 当输入字段第一次获得焦点时,防止onkeyup事件
- Javascript:第一次调用函数时获取输入值时出错
- setTimeout函数在第一次鼠标输入/悬停时未触发
- Javascript输入验证在第一次尝试时无法工作