从提供商刷新$ scope

时间:2014-09-01 17:15:23

标签: angularjs angularjs-scope server-sent-events

我们正在为我们的API开发Angularjs提供程序。我们的API提供了使用Server Sent Events从客户端的服务器接收消息的功能。不幸的是,AngularJS没有为EventSource提供内置提供程序,就像它有$ http或$ timeout一样。

这是我们到目前为止所拥有的:

var ngSuperfeedr = angular.module('ngSuperfeedr', []);

// The superfeedr client!
function SuperfeedrClient(http, config) {
  this.http = http;
  this.config = config;
}

// Stream method which connects to Eventsource
SuperfeedrClient.prototype.stream = function stream(url, options, callback) {
  if(!options) {
    options = {};
  }
  if(!options.format) {
    options.format = "json";
  }
  options['hub.mode'] = 'retrieve';
  options['hub.topic'] = url;
  options['authorization'] = Base64.encode([this.config.login, this.config.token].join(':'));

  var source = new EventSource(buildUrl(options, 'https://stream.superfeedr.com/?'));
  source.addEventListener("notification", function(e) {
    // Do stuff which will also update the scope!
    callback(e);
  });
};

ngSuperfeedr.provider('Superfeedr', function() {

  var config = {};

  this.configure = function(_config) {
    config = _config;
    return config;
  }

  this.$get = ["$scope", function Superfeedr($http) {
    return new SuperfeedrClient($http, config)
  }];
});

到目前为止,这么好。最后,实施者可以做类似的事情:

...
app.controller('ctrl', function($scope, Superfeedr) {
  $scope.count = 0;

  $scope.stream = function stream() {
    Superfeedr.stream($scope.item.subscription.feed.url, {}, function(error, result) {
      $scope.$apply(function() {
        $scope.count += 1;
      });
    });
  }
});
...

问题在于我喜欢处理提供程序中的$scope.$apply内容,因为我确信我们最终会遇到很多问题,因为人们会忘记将它包含在控制器中。 / p>

所以,我试图在我们的提供程序中公开 $scope,但是我们得到一个错误,因为$ scope仅适用于控制器和指令。如何解决这个问题?

0 个答案:

没有答案