javascript - 如果外部应用程序更改了持久模型(服务器数据库),AngularJS 可以自动更新 View 吗?

标签 javascript angularjs websocket socket.io

我刚刚开始熟悉 AngularJS,但我想构建一个 Web 应用程序,该应用程序的 View 可以在服务器端发生变化时为用户实时(不刷新)自动更新数据库。

AngularJS 可以(大部分)自动为我处理这个问题吗?如果是这样,工作的基 native 制是什么?

例如,您是否以某种方式设置 AngularJS 以定期轮询数据库以获取“模型”更改?或者使用某种类似于 Comet 的机制来通知 AngularJS 客户端代码模型已更改?

在我的应用程序中,挑战在于其他(非网络)服务器端软件有时会更新数据库。但是这个问题同样适用于纯 Web 应用程序,您可能有多个客户端通过 AngularJS Web 客户端更改数据库,并且当其中一个对数据库(模型)进行更改时,每个客户端都需要更新。

最佳答案

你有几个选择......

  1. 您可以使用 $timeout$http 每 X 毫秒进行一次轮询,或者如果您使用的数据连接到 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 实现,将 Angular 模型与服务器同步。当客户端更改某些内容时,该更改会自动发送到服务器。或者,如果服务器发生变化,它会被发送到客户端。
    这是旧版本 Angular 中的一个示例,再次使用 socket.io:https://github.com/mhevery/angular-node-socketio

编辑:对于#3,我一直在使用Firebase做这个。

关于javascript - 如果外部应用程序更改了持久模型(服务器数据库),AngularJS 可以自动更新 View 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11276520/

相关文章:

node.js - 当 Node 服务器重新启动时,如何存储/保留套接字连接

javascript - 如何动态提交输入字段的值

javascript - 设置点击为默认

javascript - 如何在 ember.js 中的同一路由中设置多个 Controller ?

node.js - AWS Elastic Beanstalk 与 ALB : Node Websocket times out

Android webkit.WebView 和 HTML5

javascript - 为什么这个 for 循环只打印一个元素?

javascript - AngularJS - href 重定向到同一域导致页面在数据准备好之前显示

javascript - Angularjs querySelector根据属性查找元素

javascript - 从 #anchor 中删除 Angular 哈希和前缀