我正在使用带有 Grails 框架的 AngularJs 并使用 Mysql 作为数据库。
我想实现 Facebook 上发生的自动视图更新等功能。
到目前为止,我能够将 JSON 数据从 Grails 控制器发送到角度控制器并填充视图。
但是我如何实现某些功能,例如更改数据库并实时更新视图而无需重新加载页面。
我遇到了
“使用 $timeout 和 $http 每 X 毫秒轮询一次”
这对现实世界的应用程序有效吗?
请通过提出一些措施或 Angular 实现来帮助我解决我的问题。
我正在使用带有 Grails 框架的 AngularJs 并使用 Mysql 作为数据库。
我想实现 Facebook 上发生的自动视图更新等功能。
到目前为止,我能够将 JSON 数据从 Grails 控制器发送到角度控制器并填充视图。
但是我如何实现某些功能,例如更改数据库并实时更新视图而无需重新加载页面。
我遇到了
“使用 $timeout 和 $http 每 X 毫秒轮询一次”
这对现实世界的应用程序有效吗?
请通过提出一些措施或 Angular 实现来帮助我解决我的问题。
对于视图的“自动”更新,我使用了 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())
}
}
如果您确实必须使用 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 部分即可。
Eylen 发布的示例就像一个魅力。此外,如果您想在控制器中侦听事件并更新模型,请执行以下操作:
grailsEvents.on('myEvent', function (data) {
$scope.$apply(function(){
$scope.mymodel = data.someField;
});
});