IE8 で grails event-push プラグインを使用すると、奇妙な動作が発生します。私はgrails 2.2、event-push 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の初期化です:
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 を入れてみたので、イベントが 2 回呼び出されたり、まったく呼び出されなかったりすることがありますが、IE8 の問題を防ぐためだけに削除しました。また、Chrome と Firefox では、すべてが期待どおりに機能し、期待どおりにメソッドを 1 回呼び出すだけです。
私にとって奇妙に聞こえる唯一のこと (意味がよくわからないため) は、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でもテストしましたが、同じ奇妙な動作が発生します。イベントが呼び出される場合もあれば、呼び出されない場合もあれば、2 回呼び出される場合もあります
編集:必要ではないことを理解しているため、サービスメソッドから @Listener アノテーションを削除しようとしました。