一旦AngularJs中的数据库发生变化,如何实现自动视图更新?

时间:2013-11-14 06:24:38

标签: javascript mysql angularjs grails

我正在使用带有Grails框架的AngularJs并使用Mysql作为数据库。

我想在Facebook上实现自动视图更新等功能。

直到现在我能够从Grails Controller向角度控制器发送JSON数据并填充视图。

但是,我如何实现功能,如某些更改数据库,并实时更新视图而不重新加载页面。

我越过

“使用$ timeout和$ http”每隔X毫秒进行一次轮询“

这对现实世界的应用会有效吗?

请通过建议一些措施或Angular实现来帮助我解决我的问题。

3 个答案:

答案 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;
    });        
});