我写了一个应用程序来理解Angular $scope.$watch()
。但这样做时遇到了一个我无法理解的问题。
使用以下代码,我希望当input
框中的值改变语句“数据正在改变!!”时将被记录到控制台。
<!DOCTYPE html>
<html lang='en' ng-app="app">
<head>
<meta charset="utf-8">
<title>My $Scope.$watch demo</title>
</head>
<body>
<div ng-controller="MainController">
<input ng-model='myData.val'>
<h1>{{myData.val}}</h1>
</div>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<script type="text/javascript">
angular.module('app', [])
.controller('MainController', ['$scope', function($scope){
$scope.myData = {};
console.log($scope.myData);
$scope.myData = { val:"Bablo"};
console.log($scope.myData.val);
$scope.$watch('$scope.myData.val', function(){
console.log("Data is changing!!");
});
}]);
</script>
</body>
</html>
但是我没有观察到我的期望,但是当我将$scope.$watch()
参数更改为myData.val
(之前它是$scope.myData.val
)时,它开始正常工作。为什么这样?
如果我通过整个$scope.myData.val
而不仅仅是mydata.val
,那么问题是什么?
答案 0 :(得分:3)
在撰写$scope.$watch('model_name', function(){})
时,您已经在model_name
下引用了$scope
,因此当您使用$scope
作为前缀时,它会查找$scope.$scope.model_name
即{ {1}}在你的情况下。
这就是$scope.$scope.myData.val
工作的原因以及为什么myData.val
没有。
答案 1 :(得分:1)
当您说$scope.$watch(..
时,这意味着angular正在关注$scope
内的属性,并且因为视图与ng-controller
绑定,因此视图中不需要追加$scope
在属性之前。
如果您将$scope
追加到您的媒体资源,则角度会查找新属性$scope.$scope
,这当然不存在。并且只要您创建此属性(例如附加$)在视图范围内,然后创建属性并开始观察它。See this fiddle并尝试连接。