我使用带有IE8的grails event-push插件有一个奇怪的行为。 我正在使用grails 2.2,事件推送1.0M7以及AngularJS(但这不应该是问题)。
我已在conf dir
中的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 inicializations,结果相同:
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注释,因为我知道没有必要。