$ timeout无法运行$ digest循环

时间:2015-11-11 06:57:39

标签: angularjs google-chrome-extension

我正在调用一个异步运行的chrome函数,所以我需要运行摘要周期来更新视图中的范围变量值。我尝试使用$ timeout和$ evalAsync,但它们无法正常工作。如果我调用$ scope。$在异步回调结束时直接应用它。但这可能会导致与Angular的摘要周期冲突,所以我想采取更安全的超时方法。以下不起作用。

$timeout(function() {
  chrome.storage.local.get('jocularOctoLamp', function(items) {
    if (Object.keys(items.jocularOctoLamp).length) {
      accountUsername = items.jocularOctoLamp.accountUsername;
    } else {
      accountUsername = false;
    };
    if (accountUsername) {
      $scope.loggedIn = true;
      $scope.user = accountUsername;
      console.log('Value of loggedIn changed.');
    } else {
      $scope.loggedIn = false;
    }
  })
});

以下工作正常。

chrome.storage.local.get('jocularOctoLamp', function(items) {
  if (Object.keys(items.jocularOctoLamp).length) {
    accountUsername = items.jocularOctoLamp.accountUsername;
  } else {
    accountUsername = false;
  };
  if (accountUsername) {
    $scope.loggedIn = true;
    $scope.user = accountUsername;
    console.log('Value of loggedIn changed.');
  } else {
    $scope.loggedIn = false;
  }
  $scope.$apply();
});

1 个答案:

答案 0 :(得分:1)

调用$timeout只会延迟执行chrome.storage.local.get()的呼叫。传递的回调函数仍然由chrome执行,异步地超出了角度范围。

在这种情况下你不应该害怕调用$apply():你是从一个超出angular范围的异步事件执行的回调函数中调用它。所以你知道你不会进入摘要周期。