1

我在使用带有 IE8 的 grails 事件推送插件时遇到了一个奇怪的行为。我正在使用 grails 2.2、event-push 1.0M7 和 AngularJS(但这不应该是问题)。

我在 conf 目录中的 MyEvents.groovy 中定义了事件

events = {
    'newActivity' browser:true
}

这是将事件发送到浏览器的服务的方法

@Listener(namespace='browser')
public void sendEvents(UserLevel level, Map<String,List<UserAchievement>> achievements, Map<String,List<UserMission>> missions){
    def activities = []
    if (level)
        activities << new RecentActivity(level)

    achievements["user"]?.each{activities << new RecentActivity(it)}
    achievements["team"]?.each{ activities << new RecentActivity(it)}

    missions["user"]?.each{activities << new RecentActivity(it)}
    missions["team"]?.each{activities << new RecentActivity(it)}

    if (activities && activities.size()>0)
        event(topic:"newActivity",data:activities)
}

这里是 js 事件监听器

grailsEvents.on("newActivity",function(data){
    for (var i=0;i<data.length;i++){//Add
        changeUserImage(data[i]);
        $scope.$apply(function(){$scope.activities.unshift(data[i]);});
    }
    while ($scope.activities.length>$scope.maxElements){ //remove
        $scope.$apply(function(){$scope.activities.pop();});
    }
});

编辑:这些是我尝试过的 grailsEvents 初始化,结果相同:

window.grailsEvents = new grails.Events($jostalan.urls.base);
window.grailsEvents = new grails.Events($jostalan.urls.base, {transport:"websocket"});
window.grailsEvents = new grails.Events($jostalan.urls.base, {transport:"websocket",shared:true});

我知道有时该事件被调用了两次,而其他的则没有,因为我尝试放置一个 console.log,但我删除它只是为了防止 IE8 出现问题。此外,在 Chrome 和 Firefox 中,一切都按预期工作,只需在预期时调用该方法。

我看到的唯一对我来说听起来很奇怪的事情(因为我不太明白它的含义),有时我会在 grails 控制台中看到以下跟踪:

grails> cpr.AtmosphereFramework If you have more than one Connector enabled, make sure they both use the same protocol, e.g NIO/APR or HTTP for all. If not, org.atmosphere.container.BlockingIOCometSupport will be used and cannot be changed.

任何人都知道为什么会发生这种奇怪的行为以及如何解决它?

编辑:我也用普通的 javascript 测试过它,同样的奇怪行为发生了。有时调用事件,有时不调用,有时调用两次

编辑:我也尝试从服务方法中删除 @Listener 注释,因为我知道这不是必需的。

4

0 回答 0