我们正在为我们的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仅适用于控制器和指令。如何解决这个问题?