我刚开始用AngularJS熟悉,但我想建立一个有获得自动更新过的实时(无刷新)用户的东西时,在服务器端的数据库改变视图一个Web应用程序。
可以AngularJS自动为我处理这个问题(主要是)? 如果是这样,什么是工作的基本机制?
例如,你不知何故设置AngularJS定期轮询DB的“模式”的转变? 或者使用某种类型的彗星般的机制来通知AngularJS客户端代码,该模型已经改变?
在我的应用程序,面临的挑战是,其他(非网络)服务器端软件将更新在时间的数据库。 但这个问题同样适用于纯Web的应用程序,你可能有多个客户端通过AngularJS Web客户端更改了数据库,他们每个人都需要在他们其中一人更改为DB(模型)进行更新。
你有几个选择...
你可以通过做轮询每X毫秒$timeout
和$http
,或者如果你正在使用的数据挂接到一个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实现其同步与服务器的角度模式。 当客户端改变了一些东西,这种变化就会自动发送到服务器。 或者,如果服务器的更改,它就会被发送到客户端。
下面是在旧版本的角度,再次使用socket.io的例子: https://github.com/mhevery/angular-node-socketio
编辑 :对于#3,我一直在使用火力地堡做到这一点。
下面是一个使用码头,而不是节点的实现。 所述angularjs部分是基于所述角度种子应用程序。 我不知道,如果角码是地道的...但我测试过这个工作。 HTH -Todd。
TimerWebSocketServlet见
https://gist.github.com/3047812
controllers.js
// -------------------------------------------------------------
// TimerCtrl
// -------------------------------------------------------------
function TimerCtrl($scope, CurrentTime) {
$scope.CurrentTime = CurrentTime;
$scope.CurrentTime.setOnMessageCB(
function (m) {
console.log("message invoked in CurrentTimeCB: " + m);
console.log(m);
$scope.$apply(function(){
$scope.currentTime = m.data;
})
});
}
TimerCtrl.$inject = ['$scope', 'CurrentTime'];
services.js
angular.module('TimerService', [], function ($provide) {
$provide.factory('CurrentTime', function () {
var onOpenCB, onCloseCB, onMessageCB;
var location = "ws://localhost:8888/api/timer"
var ws = new WebSocket(location);
ws.onopen = function () {
if(onOpenCB !== undefined)
{
onOpenCB();
}
};
ws.onclose = function () {
if(onCloseCB !== undefined)
{
onCloseCB();
}
};
ws.onmessage = function (m) {
console.log(m);
onMessageCB(m);
};
return{
setOnOpenCB: function(cb){
onOpenCB = cb;
},
setOnCloseCB: function(cb){
onCloseCB = cb;
},
setOnMessageCB: function(cb){
onMessageCB = cb;
}
};
})});
web.xml中
<servlet>
<servlet-name>TimerServlet</servlet-name>
<servlet-class>TimerWebSocketServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TimerServlet</servlet-name>
<url-pattern>/api/timer/*</url-pattern>
</servlet-mapping>
你所寻找的是火力地堡和Deployd 。 火力地堡配有一个适配器也使得用它轻而易举: http://angularfire.com/
据“探索流星”的书,角手表/示波器类似流星的有关反应的计算...但是角度是客户只并给出粒状较少的控制比流星。
我的印象是,采用了棱角分明可能是一个更适合加入反应到现有的应用程序,当你使用它的整个事情,而流星大增。 但我有角没有实际经验,但(虽然我已经建立了一些小流星的应用程序)。
所以,安迪乔斯林在他的答复中提到我opnion的最佳解决方案,第三个选择,这是双向然后通过WebSockets或其他异步库你处理任何维护状态(这将是一个Chrome扩展和Chrome的消息API例如应用程序),并toddg给的,将如何实现的例子。 然而,在他的榜样,他在AngularJS实施反模式:该服务呼叫控制器。 取而代之的是,该模型应该放在里面的服务,然后从控制器引用。
服务插座回调将修改服务模式,因为它是从控制器引用,它会更新视图。 如果你处理的是虽然可以重新分配的基本数据类型或变量小心,这些都需要在控制器上的手表,使这项工作。
文章来源: Can AngularJS auto-update a view if a persistent model (server database) is changed by an external app?