Angular正在失去我的JSON值,我正在试图找出原因。我想我需要做出承诺或超时,或者可能申请。我不太确定......
角度版本:1.2.1
galleryApp.controller('GalleryCtrl', function ($scope, $http, $routeParams, $filter){
$http.get('mygallery.json').success(function(data) {
$scope.gallery = data;
//DISPLAY: CONTENTS OF JSON IN OBJECT : WORKS
console.log($scope.gallery);
});
//DISPLAY: undefined : DOES NOT WORK AS EXPECTED
console.log($scope.gallery);
//DISPLAY: CONTENTS OF OBJECT: I can see scope.gallery exists!
//I just can't seem to access scope.gallery directly outside of http.get()
console.log($scope);
});
注意:scope.gallery或“gallery”在我看来完美无缺! {{gallery.name}}等。
似乎幕后有一些角色正在做的范围,或者一些我不太理解的概念。
答案 0 :(得分:1)
嗯,这是微不足道的,因为$ http.get是一个异步操作。因此,当它正在工作时,剩下的代码将完成。如果你记录$ scope.gallery它尚未定义。如果您记录$ scope,它仍未定义,但会在调用成功回调时更新。这种效果的原因只是console.log的功能,它不会写入当前快照而是写入对象本身,因此如果更改,控制台的输出将分别更新。但是一般来说,$ http.get之外的代码都不会像你期望的那样工作。因此,您应该使用成功回调或使用$ watch来跟踪更改。
答案 1 :(得分:0)
http.$get
的结果是一个承诺(特别是HtmlPromise,请参阅$http docs)。承诺在$q docs中描述如下:
用于与对象交互的接口,该对象表示异步执行的操作的结果,并且可以在任何给定的时间点完成或不完成
success
的{{1}}方法会在解析了promise(意味着操作完成)后运行回调函数。因此匿名函数异步运行。当它在回调之外被记录时,回调尚未运行,因此尚未设置范围变量。
我认为视图是预期的,因为http请求完成并且视图更新得如此之快,这是不可思议的。