我从拥有自定义回调函数的JSONP Feed中提取for example:
jsonpCallbackAllStar2015({
"events": [
{
"title": "XYZ"
}
...
]
})
我可以使用solution posted here这样做:
var jsonUrl = 'http://i.cdn.turner.com/nba/nba/.element/media/2.0/teamsites/warriors/json/json-as2015.js?callback=JSON_CALLBACK' + (new Date().getTime());
$http.jsonp(jsonUrl);
window.jsonpCallbackAllStar2015 = function(data) {
$scope.events = data.events;
}
但是我现在想在服务中执行此操作,以便我可以一次加载数据并将其注入所有控制器。但是,当我尝试这样做时,我收到$injector undefined错误,我猜测是因为该服务的回报速度不够快:
eventsFactory.$inject = ['$http'];
function eventsFactory($http) {
var jsonUrl = 'http://i.cdn.turner.com/nba/nba/.element/media/2.0/teamsites/warriors/json/json-as2015.js?callback=JSON_CALLBACK' + (new Date().getTime());
$http.jsonp(jsonUrl);
window.jsonpCallbackAllStar2015 = function(data) {
return data.events;
}
}
有没有解决这个问题,还是我必须在每个控制器中重复jsonp请求? Here is a fiddle
答案 0 :(得分:2)
虽然这不是一个漂亮的解决方案,但这应该适合你。我添加了一些非常基本的缓存。我没有在角度使用jsonp,似乎在$ http配置中设置缓存不起作用。这将是一个更好的选择。
app.factory('eventsFactory', [ '$http', '$q',
function( $http, $q ) {
var pub = {};
var jsonUrl = 'http://i.cdn.turner.com/nba/nba/.element/media/2.0/teamsites/warriors/json/json-as2015.js?callback=JSON_CALLBACK' + (new Date().getTime()),
cachedResponse;
pub.getEvent = function() {
var deferred = $q.defer();
if ( cachedResponse ) {
deferred.resolve( cachedResponse );
}
else {
$http.jsonp( jsonUrl );
window.jsonpCallbackAllStar2015 = function( data ) {
cachedResponse = data;
deferred.resolve( data );
}
}
return deferred.promise;
};
return pub;
}
]);
现在您可以在控制器内执行此操作:
app.controller('someController', [ 'eventsFactory',
function( eventsFactory) {
eventsFactory.getEvent().then(function( data ) {
console.log( data );
});
}
]);