如何使用Angular$http.jsonp从S3加载JSON文件
How to load JSON file from S3 using Angular $http.jsonp
我正在从S3加载JSON文件。文件加载成功,但问题是,我无法访问回调函数中的AnglarJS模块($scope、服务等),因为它是在angularJS之外编写的。有没有办法在我的回调中访问$scope?
AngularJS代码
var url = "http://my_s3_url/abc/v1/klm/my.json"
$http.jsonp(url);
my.json
jsonp_callback({name:"xyz",age:2})
回调
<script>
function jsonp_callback(data) {
console.log(data.name);
// cannot access $scope here :(
}
</script>
嗯,您使用的是$http
,所以我想angular通常是可用的。
有办法在我的回调中访问$scope
吗
如果脚本块在同一文档中,则可以通过执行(即angular.element('body').scope()
)来访问任何范围。
<script>
function jsonp_callback(data) {
console.log(data.name);
// access $scope here :)
var scope = angular.element('body').scope();
scope.$apply(function() {
scope.lastResult = data;
});
}
</script>
元素body
仅用作示例。它可能适用于与目标范围相关的任何DOM元素。
您不应该自己编写回调函数。从$http.jsonp调用得到的promise中使用特殊的"success"方法就足够了。如果以下代码在控制器中,则您应该仍然可以访问$scope变量。
$http.jsonp(url).
success(function(data, status, headers, config) {
// The data is here
}).
编辑我意识到这个答案取决于传递给$http.jsonp的url中是否有一个字符串JSON_CALLBACK,我怀疑Angular用它定义的一些独特的回调函数替换了它。然后,服务器必须对此进行解释,并输出封装在此函数调用中的JSON。这可能在S3上不起作用,因为S3只提供静态文件。
使用$q promise库将数据传递回作用域
在目录.js 中
function eventReturn($http, $q){
return {
getEvent: function(){
var deferred = $q.defer();
$http({method:'GET', url'http://my_s3_url/abc/v1/klm/my.json'}).
success(function(data, status, headers, config){
deferred.resolve(data);
});
return deferred.promise;
}
}
};
和控制器js
$scope.event = eventReturn.getEvent();
我已经为您的场景创建了plunker,就像在页面加载时,它会从$http读取json文件,然后调用外部js文件函数,它会向该函数传递$scope和结果数据,该外部函数通过使用scope获取结果并显示。
网址:http://plnkr.co/edit/k66KevvcIyxiKA5QSBAc?p=preview
希望这就是你的样子。
我使用AWS javascript库,必须使用apply:
AWS.config.update({accessKeyId: '?', secretAccessKey: '?'});
var s3 = new AWS.S3({ maxRetries: 5});
console.log("S3 correctly configured");
s3.listObjects( {Bucket : 'bucketName', Prefix : 'foo/bar/' }, function (err, data) {
if (err) {
console.log(err); // an error occurred
} else {
console.log(data); // successful response
sc.$apply(function() {
sc.prefix = data.Prefix;
sc.data = data;
});
}
});
- 如何使用url加载程序在webpack中导入多个图像
- 如何在生成下载文件时显示加载动画
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Emberjs应用程序加载在除Index之外的所有路由上
- 在chrome.tabs.onCreated之后加载HTML页面
- 单击F5时如何停止页面加载
- HTML5音频加载和播放获胜'我不能在iPad上工作
- 跟踪在页面加载时应用内联样式的JavaScript
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- jQuery Lazy加载动画滚动
- Html页面上的多个Base64图像和平滑加载
- 如何创建带有插槽的vue js组件预加载程序
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 如何使该数据在所有元素中加载
- Chrome扩展没有't在重新加载之前考虑期权价值
- 如何使用Angular$http.jsonp从S3加载JSON文件
- Javascript/Amazon s3-通过threejs加载Javascript文件时出现访问控制源错误
- 从AWS S3加载图像时获取响应头
- 使用cors从aws s3加载的Canvas元素和图像在前几次加载时不工作