可以AngularJS自动更新,如果持久化模型(Server数据库)由外部应用程序改变了看法?(Ca

2019-06-25 22:42发布

我刚开始用AngularJS熟悉,但我想建立一个有获得自动更新过的实时(无刷新)用户的东西时,在服务器端的数据库改变视图一个Web应用程序。

可以AngularJS自动为我处理这个问题(主要是)? 如果是这样,什么是工作的基本机制?

例如,你不知何故设置AngularJS定期轮询DB的“模式”的转变? 或者使用某种类型的彗星般的机制来通知AngularJS客户端代码,该模型已经改变?

在我的应用程序,面临的挑战是,其他(非网络)服务器端软件将更新在时间的数据库。 但这个问题同样适用于纯Web的应用程序,你可能有多个客户端通过AngularJS Web客户端更改了数据库,他们每个人都需要在他们其中一人更改为DB(模型)进行更新。

Answer 1:

你有几个选择...

  1. 你可以通过做轮询每X毫秒$timeout$http ,或者如果你正在使用的数据挂接到一个REST服务,您可以使用$resource ,而不是$http

  2. 你可以创建一个使用一些的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); }; } 
  3. 你可以得到真正的高科技和创建的WebSocket实现其同步与服务器的角度模式。 当客户端改变了一些东西,这种变化就会自动发送到服务器。 或者,如果服务器的更改,它就会被发送到客户端。
    下面是在旧版本的角度,再次使用socket.io的例子: https://github.com/mhevery/angular-node-socketio

编辑 :对于#3,我一直在使用火力地堡做到这一点。



Answer 2:

下面是一个使用码头,而不是节点的实现。 所述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>


Answer 3:

你所寻找的是火力地堡和Deployd 。 火力地堡配有一个适配器也使得用它轻而易举: http://angularfire.com/



Answer 4:

据“探索流星”的书,角手表/示波器类似流星的有关反应的计算...但是角度是客户只并给出粒状较少的控制比流星。

我的印象是,采用了棱角分明可能是一个更适合加入反应到现有的应用程序,当你使用它的整个事情,而流星大增。 但我有角没有实际经验,但(虽然我已经建立了一些小流星的应用程序)。



Answer 5:

所以,安迪乔斯林在他的答复中提到我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?