Google chrome extension $scope.$apply不';不要在Chrome扩展弹出窗口中执行任何操作
我正在编写一个chrome扩展,它由一个后台进程和一个弹出窗口组成。后台进程不断发出ajax请求以获取新数据,弹出窗口显示信息 通过极其简化的方式,background.js过程如下所示:Google chrome extension $scope.$apply不';不要在Chrome扩展弹出窗口中执行任何操作,google-chrome-extension,angularjs,Google Chrome Extension,Angularjs,我正在编写一个chrome扩展,它由一个后台进程和一个弹出窗口组成。后台进程不断发出ajax请求以获取新数据,弹出窗口显示信息 通过极其简化的方式,background.js过程如下所示: var Background = { data: {}, poll: function() { $.ajax({ url: 'some_url', success: function(data) {
var Background = {
data: {},
poll: function() {
$.ajax({
url: 'some_url',
success: function(data) {
this.data = data;
chrome.extension.sendMessage('update');
}.bind(this)
});
},
startPolling: function() {
setInterval(this.poll.bind(this), 10000);
}
};
$(Background.startPolling.bind(Background));
这将每隔10秒拍摄一次ajax请求,获取一些数据,并将其设置为Background.data
。同样,这是非常简单的。您可以在成功回调中看到sendMessage
调用
我的popup.js看起来像这样,也非常简化:
var Background = chrome.extension.getBackgroundPage().Background;
angular.module('App', [])
.controller('PopupCtrl', function PopupCtrl($scope) {
$scope.data = Background.data;
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
if (request == 'update') {
console.log('update');
$scope.$apply();
}
});
});
当然,popup.html看起来像:
<html ng-app="App" ng-csp>
<body ng-controller="PopupCtrl">
<p>{{data.title}}</p>
<p>{{data.body}}</p>
<p>{{data.date}}</p>
</body>
</html>
{{data.title}
{{data.body}
{{data.date}
消息肯定已收到,因为我可以看到控制台每隔10秒打印一次“更新”。我还知道数据正在正确更新,因为如果我关闭并重新打开弹出窗口,新数据将正确显示。因此,$scope.$apply()
只是什么都不做
如何修复此问题?但在“onMessage”侦听器中,除了登录到控制台之外,您什么也没做?应用什么?在我的代码中(此处未显示),作为作用域一部分的数据对象是对后台更新的数据的引用。我会编辑我的问题,这样你很快就能明白我的意思。实际上@Stewie,你可能是对的-
$scope。数据可能没有正确设置,可能只是在每次打开窗口时javascript重新运行时重置。必须进一步研究一下。是的,$scope.data=Background.data
不起作用,因为ajax回调中的this.data=data
正在取消引用的链接,而不是更新现有的引用。我改变了,现在它工作了<代码>$scope.$apply()
不是问题所在。哎哟。@cilphex结束这个问题会很好:)