我有这个工厂:
.factory("Member", function($resource) {
var endpoint = "http://some valid url";
function generateMemberToken (id1, id2) {
return $resource(endpoint, null, {
query: {
method: 'GET',
headers: {
'id1': id1,
'id2': id2
}
}
})
}
var member = {
generateMemberToken : generateMemberToken
}
return member;
})
和这个控制器:
.controller('memberKeyCtrl', function($scope, Member){
$scope.generateMemberToken = function () {
$scope.member = Member.generateMemberToken('123456789', '789456123').query();
console.log($scope.member);
console.log($scope.member.someProperty); // problem here
}
$ scope.member是来自API的JSON响应,即
{firstName:Joe, lastName:smith}
我可以在控制台中看到我的输出" $ scope.member"并且它具有我在这里寻找的属性,称为.someProperty。我似乎无法提取这些数据,因为我在这里有这个数据,请参阅这里的" //问题"控制器中的一行。
我的猜测是,我以某种方式错误地设置了我的工厂,或者没有在工厂外以某种方式提供该属性。角度新,因此在理解这一点时遇到一些麻烦。
如果需要任何其他信息,请与我们联系。
答案 0 :(得分:6)
这里的问题是$ resource的Async特性,以及控制台如何与您的数据交互。
.query()
是异步调用,这意味着它不会立即返回值;相反,它允许代码继续流动。您的下一个声明是console.log($scope.member);
,它不会立即展开$scope.member
以查看其属性,直到使用或检查它们为止。下一个电话是console.log($scope.member.someProperty);
,将展开$scope.member
以查找someProperty
。由于您.query()
的回调尚未返回,因此将记录undefined
。当你去查看 first console.log
中的内容时,回调已经完成,因此对象看起来好像一直都有所有属性,即使它当他们被试图被访问时,他们真的没有。
处理此问题的简单方法是将调用包装在.then()
中,以确保在.query()
的承诺返回之前您不执行它们。为了链.then()
,您需要访问返回的承诺,即
$scope.generateMemberToken = function () {
$scope.member = Member.generateMemberToken('123456789', '789456123')
.query().$promise.then(function(){
console.log($scope.member);
console.log($scope.member.someProperty); // problem here
});
};
.query()
函数语法允许匿名回调,这将允许您传递应在query()
完成时执行的函数,而不是链接.then()
语句。例如:
$scope.generateMemberToken = function () {
$scope.member = Member.generateMemberToken('123456789', '789456123')
.query({}, function() {
console.log($scope.member);
console.log($scope.member.someProperty); // problem here
});
}