2

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

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

到目前为止,我能够将 JSON 数据从 Grails 控制器发送到角度控制器并填充视图。

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

我遇到了

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

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

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

4

3 回答 3

2

对于视图的“自动”更新,我使用了 Grails 事件推送插件,我建议你看看它。 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())
    }
}
于 2013-11-15T11:29:43.107 回答
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 部分即可。

于 2013-11-14T08:38:42.773 回答
0

Eylen 发布的示例就像一个魅力。此外,如果您想在控制器中侦听事件并更新模型,请执行以下操作:

grailsEvents.on('myEvent', function (data) {
    $scope.$apply(function(){
        $scope.mymodel = data.someField;
    });        
});
于 2014-02-22T06:44:19.370 回答