Google chrome extension $scope.$apply不';不要在Chrome扩展弹出窗口中执行任何操作

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) {

我正在编写一个chrome扩展,它由一个后台进程和一个弹出窗口组成。后台进程不断发出ajax请求以获取新数据,弹出窗口显示信息

通过极其简化的方式,background.js过程如下所示:

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结束这个问题会很好:)