AngularJS,双向数据绑定& $ watch(),等价?

时间:2014-04-08 23:55:39

标签: angularjs

作为AngularJS的新手,根据我的有限经验,我对以下语法的理解是它在视图和模型之间建立了双向数据绑定,这意味着视图中的输入是否会更改模型更改以匹配AND副反之亦然。

<form ng-controller="StartUpController">
     Starting: <input ng-change="computeNeeded()"
                       ng-model="funding.startingEstimate">
     Recommendation: {{funding.needed}}
</form>

<script>
    function StartUpController($scope) {
         $scope.funding = { startingEstimate: 0 };
         $scope.computeNeeded = function() {
              $scope.needed = $scope.startingEstimate * 10;
         };
    }
</script>

然后我读到如果其他元素绑定到模型中的同一个变量,或者数据库可能更新模型,那么必须使用$ watch()以便视图更新。但从我的新手角度来看,这就是双向数据绑定已经在做什么。

<form ng-controller="StartUpController">
     Starting: <input ng-model="funding.startingEstimate">
     Recommendation: {{funding.needed}}
</form>

<script>
function StartUpController($scope) {
     $scope.funding = { startingEstimate: 0 };
     computeNeeded = function() {
            $scope.funding.needed = $scope.funding.startingEstimate * 10;
     };
     $scope.$watch('funding.startingEstimate', computeNeeded);
} 

有人可以为我澄清......非常感谢提前。

1 个答案:

答案 0 :(得分:2)

如果这是您所拥有的确切代码,那么问题可能是您没有正确引用您的范围属性,而不是双向数据绑定不起作用。

您的脚本标记应为:

<script>
    function StartUpController($scope) {
         $scope.funding = { 
             startingEstimate: 0,
             needed: 0
         };
         $scope.computeNeeded = function() {
              $scope.funding.needed = $scope.funding.startingEstimate * 10;
         };
    }
</script>

编辑:为了进一步解释,您提供的两个代码示例(如果范围属性被正确引用)是等效的如果用户是唯一一个将更改值的人funding.startingEstimate 的。如果其他任何内容(如数据库更新等)可以更新该值,那么在该属性上使用$watch()是每次更改时计算另一个值的唯一方法,无论是用户还是其他方式。 / p>