什么意思缺少观看表达

时间:2014-07-18 06:40:53

标签: angularjs

新手问题,我阅读了rootscope.$watch的文件。 $watch的语法是

$watch(watchExpression, [listener], [objectEquality], [deregisterNotifier]);

但我看到这些例子使用它如下。

var food;
scope.foodCounter = 0;
expect(scope.foodCounter).toEqual(0);
scope.$watch(
 // This is the listener function
 function() { return food; },
 // This is the change handler
 function(newValue, oldValue) {
   if ( newValue !== oldValue ) {
     // Only increment the counter if the value changed
     scope.foodCounter = scope.foodCounter + 1;
   }
 }
);

缺少WatchExpression是什么意思?感谢。

1 个答案:

答案 0 :(得分:1)

watchExpression既可以是字符串也可以是函数 - 请参阅问题中公布的angularjs文档。在问题中发布的示例将永远不会触发更改处理程序,因为food始终未定义。

如果您将函数用作watchExpression,则该函数必须返回不同的值才能触发更改处理程序。正如angularjs官方文件中所述

  

在每个$ digest周期计算的表达式。改变了   返回值触发对侦听器的调用。

代码段

function Ctrl($scope) {
    $scope.food = "Laksa";
    $scope.foodCounter = 0;
    $scope.$watch(
    //this is watch expression using function
    function (scope) {
        return scope.food;
    },
    //this is listener - change handler
    function (newValue, oldValue) {
        console.log(newValue, oldValue);
        if (newValue !== oldValue) {
            // Only increment the counter if the value changed
            $scope.foodCounter = $scope.foodCounter + 1;
        }
    });
}

示例 - http://jsfiddle.net/4atA2/2/

此侦听器功能相当于$scope.$watch('food',...,因为它没有其他逻辑。您可以灵活地添加额外的逻辑检查,以决定是否要触发更改处理程序。例如,观察两个范围变量。

示例 - http://jsfiddle.net/5NLNa/5/

function (scope) {
    if(scope.drink == "Milo") {
        return scope.food;
    }
},