关于$ scope的第一个参数的困惑。$ watch

时间:2013-09-18 11:34:11

标签: javascript angularjs angularjs-directive angularjs-scope

从搭便车徒步旅行者指南到指令light bulb example

  scope.$watch(function() {
            scope.bulb = controller.getState();
        });

$watch的第一个参数是一个函数,这里正在观察什么?

我在scope上阅读了另一篇SO的帖子,这就是解释。

$watch方法的第一个参数(”watchExpression“)可以是Angular字符串表达式(根据$ scope计算),也可以是使用{{1}调用的函数}作为第一个参数。“

我仍然不清楚使用函数作为$scope的第一个参数,来自灯泡示例   - 作为参数隐式传递范围到该函数?   - 该函数是否隐式返回scope.bulb,因此正在监视scope.bulb?

3 个答案:

答案 0 :(得分:4)

不,正在观看功能。这意味着调用该函数并根据上次每次apply-digest循环至少返回一次的值检查其值!范围确实已通过,但未在您的示例中使用。 HTH

P.S。使用监视表达式在范围上设置值有点奇怪。 watch表达式函数应该做的是返回状态并在回调中设置范围值。这意味着它仅在更改时设置,而不是每次检查时设置。奇怪的例子!

答案 1 :(得分:0)

对我来说,这似乎是$watch的错误用法。该函数应返回一个值,该值将被观察以进行更改,但在这种情况下,它将始终为undefined,因此将永远不会监视值的更改。 更好的方法是这样的:

scope.$watch(function() {
    return controller.getState();
}, function(newVal) {
    scope.bulb = newVal;
});

这会关注controller.getState()的更改,并会在更改时将新值分配给scope.bulb

答案 2 :(得分:0)

这是在调用$ digest时通知的习惯用法。从documentation开始,请参阅$watch的文档:

  

如果您想在每次调用$ digest时收到通知,您可以注册一个没有监听器的watchExpression函数。 (由于watchExpression可以在检测到更改时每$摘要周期执行多次,因此请准备好多次调用您的监听器。)