我正在调用一个异步运行的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();
});
答案 0 :(得分:1)
调用$timeout
只会延迟执行chrome.storage.local.get()
的呼叫。传递的回调函数仍然由chrome执行,异步地超出了角度范围。
在这种情况下你不应该害怕调用$apply()
:你是从一个超出angular范围的异步事件执行的回调函数中调用它。所以你知道你不会进入摘要周期。