我刚刚开始熟悉 AngularJS,但我想构建一个 Web 应用程序,该应用程序的 View 可以在服务器端发生变化时为用户实时(不刷新)自动更新数据库。
AngularJS 可以(大部分)自动为我处理这个问题吗?如果是这样,工作的基 native 制是什么?
例如,您是否以某种方式设置 AngularJS 以定期轮询数据库以获取“模型”更改?或者使用某种类似于 Comet 的机制来通知 AngularJS 客户端代码模型已更改?
在我的应用程序中,挑战在于其他(非网络)服务器端软件有时会更新数据库。但是这个问题同样适用于纯 Web 应用程序,您可能有多个客户端通过 AngularJS Web 客户端更改数据库,并且当其中一个对数据库(模型)进行更改时,每个客户端都需要更新。
最佳答案
你有几个选择......
您可以使用
$timeout
和$http
每 X 毫秒进行一次轮询,或者如果您使用的数据连接到 REST 服务,您可以使用$resource
而不是$http
。您可以创建一个使用某些 Websocket 实现并使用
scope.$apply
来处理套接字推送的更改的服务。 下面是一个使用 socket.io 的示例,这是一个 node.js websocket 库:myApp.factory('Socket', function($rootScope) { var socket = io.connect('http://localhost:3000'); //Override socket.on to $apply the changes to angular return { on: function(eventName, fn) { socket.on(eventName, function(data) { $rootScope.$apply(function() { fn(data); }); }); }, emit: socket.emit }; }) function MyCtrl($scope, Socket) { Socket.on('content:changed', function(data) { $scope.data = data; }); $scope.submitContent = function() { socket.emit('content:changed', $scope.data); }; }
您可以获得真正的高科技,并创建一个 websocket 实现,将 Angular 模型与服务器同步。当客户端更改某些内容时,该更改会自动发送到服务器。或者,如果服务器发生变化,它会被发送到客户端。
这是旧版本 Angular 中的一个示例,再次使用 socket.io:https://github.com/mhevery/angular-node-socketio
编辑:对于#3,我一直在使用Firebase做这个。
关于javascript - 如果外部应用程序更改了持久模型(服务器数据库),AngularJS 可以自动更新 View 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11276520/