【问题标题】:AngularJS Controller to update $scope automatically when backend data changesAngularJS 控制器在后端数据更改时自动更新 $scope
【发布时间】:2014-11-08 12:55:51
【问题描述】:

我有一个服务,它使用 $http 从 REST API 中“获取”一些 JSON 数据。 Controller 使用 Service 来获取这些数据并在 $scope 中对其进行初始化。我怎样才能使每次 JSON API 更改时,更改都会在 $scope 中更新,从而在视图中更新?

控制器:

app.controller('MainController', function ($scope, BuildService) {
    init();
    function init() {
        BuildService.getBuilds().then(function() {
            $scope.builds = BuildService.data();
        });
    }
});

服务:

app.service('BuildService', function ($http, $q) {

    var BuildService = {}; 

    var deffered = $q.defer();
    var data = [];  

    BuildService.getBuilds = function () {
        //return builds;

        $http.get('/api').
          success(function(d, status, headers, config) {
            // this callback will be called asynchronously
            // when the response is available
            data = d;
            deffered.resolve();

          }).
          error(function(d, status, headers, config) {
            // called asynchronously if an error occurs
            // or server returns response with an error status.
            deffered.reject();
          });

          return deffered.promise;

    };

    BuildService.data = function() { return data; };

    return BuildService;

});

【问题讨论】:

    标签: javascript json angularjs api rest


    【解决方案1】:

    这个问题不是 AngularJS 特有的。你想要实现的是一个实时应用。

    方法一:轮询

    使用$interval 每 30 秒左右检查一次 JSON API。

    方法二:基于WebSocket的通知

    如果您可以控制 JSON API,则可以创建另一个基于 WebSocket 的通知 API。每当 JSON API 发生变化时,通知客户端重新获取 JSON API。

    【讨论】:

      【解决方案2】:

      我想说你真的有太多不必要的逻辑。保持简单,就这样。如果您想重用 GET,可以在 getBuilds 控制器方法中进行。

      app.controller('MainController', function ($scope, $http, BuildService) {
          init();
          function init() {
              $http.get('/api').
                  success(function(data) {
                      $scope.builds = data;
                  });
          }
      });
      

      【讨论】:

      • 好的,谢谢,这样更好。但是如果数据发生变化,我怎样才能让它自动更新 $scope?
      • 只有在您提出请求时,您的数据才会改变。如果你想检查你的构建,你有两个选择。您可以实现轮询,这意味着您每隔x 秒执行与init 函数相同的GET。或者您查看WebSockets,它使您能够在您的页面和服务器之间建立双工连接,从而使您能够监听来自服务器的update now 消息。
      猜你喜欢
      • 2015-12-02
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      相关资源
      最近更新 更多