Angular的$scope和$watch混淆了

Angular $scope confusion with $watch

本文关键字:watch scope Angular      更新时间:2023-09-26

我的Angular 1.0之旅还在起步阶段。我正在学着喜欢它,但有几个地方我还是摸不着头脑。

最近,我在使用$watch时遇到了一些让我困惑的事情。看一下:

$scope.$watch('cookies', function() {
  if ($cookies.getAll().redditSession) {
    $scope.$emit('cookiesChanged')
 // $scope.userWelcome = cookieService.decodeCookie($cookies.get('redditSession'))
  }
})
$scope.$on('cookiesChanged', function() {
  $scope.userWelcome = cookieService.decodeCookie($cookies.get('redditSession'))
})

这段代码可以工作。如果我的cookie发生了变化,我就会发出一个事件,从而触发事件侦听器,从而改变$scope的值。欢迎访问存储在cookie中的一些值。如果我在应用程序中导航到另一条路由,我就会看到这个变化。

然而,我想知道为什么我必须在这里使用事件发射器?注意我注释掉的那一行。我先试了一下,但它没有改变$scope的值。userWelcome,即使我移动到应用程序的另一个页面,我也必须重新加载页面才能看到我登录了。

这是怎么回事?

尝试直接观看cookie:

$scope.$watch(
    function () {
        return $cookies.get('redditSession');
    },
    function (newValue) {
        if (newValue) { 
            $scope.userWelcome = cookieService.decodeCookie(newValue); 
        };
    }
);

您的错误在于您试图使用标准方法获得新值。获得新值的方法是将其添加到函数的参数中。是这样的:

$scope.$watch('cookies', function(newValue, oldValue) {
  if (newValue.getAll().redditSession) {
    $scope.userWelcome = cookieService.decodeCookie(newValue.get('redditSession'))
  }
  // also try this
  console.log(oldvalue === $cookies);
});

干杯!