我正在使用带有Grails框架的AngularJs并使用Mysql作为数据库。
我想在Facebook上实现自动视图更新等功能。
直到现在我能够从Grails Controller向角度控制器发送JSON数据并填充视图。
但是,我如何实现功能,如某些更改数据库,并实时更新视图而不重新加载页面。
我越过
“使用$ timeout和$ http”每隔X毫秒进行一次轮询“
这对现实世界的应用会有效吗?
请通过建议一些措施或Angular实现来帮助我解决我的问题。
答案 0 :(得分:2)
对于视图的“自动”更新,我使用了Grails Events Push Plugin,我建议您查看它。 http://grails.org/plugin/events-push
将事件发送到浏览器并在客户端中收听它们并使用propper信息更新AngularJS范围非常容易。
示例强>
angularJS文件
window.grailsEvents = new grails.Events('http://myAppUrl.com', {enableXDR:true,readResponsesHeaders:false});
/**
* Module for listening to grails events
*/
angular.module('grailsEvents', []).factory('grailsEvents', function() {
return window.grailsEvents
});
window.myModule = angular.module('myModule',['grailsEvents'])
.run(function(){
grailsEvents.on('myEvent',function(data){
//Every time an event occurs, this will be executed
console.log(data);
});
});
MyEvents.groovy(在grails-app / conf中)
events = {
'myEvent' browser:true
}
TestController.groovy(发送事件的控制器示例)
class TestController{
def index(){
event(topic:'myEvent',data:MyDomain.list())
}
}
答案 1 :(得分:1)
如果你必须使用MySQL,我会建议稍微长一点的路线,记住性能。你绝对不希望每X秒继续轮询。评论中指出的SocketIO方法是一个很好的方法。但是,您需要稍微扩展您的设计。
您需要实施“主题”概念。例如,假设您有一个名为Fruits的页面,当有人发布关于Fruits的内容时,您希望自动更新。那么你要做的就是创建一个名为/ topics / fruits的“房间”(在Socket.IO术语中),让任何正在查看此页面的人“订阅”到这个房间。接下来当有人发布关于水果的内容时,您需要做的就是将这些新数据“推送”到/ topics / fruits室,并且该视图上的每个人都将获得更新。
由于您使用的是grails,因此您需要指出这一点:http://compiledammit.com/2012/09/05/websockets-and-grails-broadcasting-to-topics/。对于AngularJS部分,您可以在http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/处阅读并只实现Socket.io客户端部分。只需忽略该帖子上的NodeJS部分即可。
答案 2 :(得分:0)
Eylen发布的例子就像一个魅力。此外,如果您想监听控制器中的事件并更新模型,请按以下步骤操作:
grailsEvents.on('myEvent', function (data) {
$scope.$apply(function(){
$scope.mymodel = data.someField;
});
});