角度$范围与$ watch混淆

时间:2016-11-06 18:26:39

标签: javascript angularjs cookies

我还处在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.userWelcome的值更改为存储在cookie中的某个值。如果我在我的应用程序中导航到另一条路线,我会看到此更改。

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

这里发生了什么?

2 个答案:

答案 0 :(得分:0)

您的错误在于您尝试使用标准方法获取新值。实际获取新值的方法是将其添加到函数的参数中。在这里:

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

干杯!

答案 1 :(得分:0)

尝试直接观看Cookie:

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