我正在开发一个简单的AngularJS应用程序,它对用户进行身份验证并显示与用户关联的事务列表。此外,还有一个下拉列表,允许用户按年度过滤交易。组合框模型是我通过AngularJS资源从API检索的值数组,但只有在我检索到当前用户之后。这是代码:
//retrieve the user
UserManagement.getCurrentUser().then(function (user) {
//retrieve the transactions
$scope.transactions = Transactions.query({
userid: user.UserName,
status: $scope.status
});
//retrieve the array for the dropdown
//and return a promise
return TimeFilters.get({
userid: user.UserName,
status: $scope.status,
timefilter: 'years'
});
}).then(function (years) {
//set a scope variable to the array to bind in the view
$scope.timefilters.years = years;
console.debug(years);
//set also the currently selected year
$scope.timefilters.currentYear = $scope.timefilters.years[0];
})
即使我今天学会了承诺,也许我误解了一些东西,但这段代码似乎很简单。
问题在于,当我尝试将currentYear
分配给timefilters.years
的第一个元素时,分配失败,因为数组仍然是空的,即使它不应该是,因为我我正试图在.then
函数中进行分配。结果是下拉列表中填充了年份,但未选择年份。
我在这里误解了什么?
顺便说一下,资源调用会返回预期的数据,所以这不是问题。编辑:发布后我将第一个then
中的return语句更改为:
return TimeFilters.get({...}).$promise
现在它按预期工作。但我认为$ resource.get本来是要回报一个承诺。我真的很困惑。有人可以澄清吗?
答案 0 :(得分:1)
重要的是要意识到调用$ resource对象方法 立即返回一个空引用(对象或数组取决于 IsArray的)。一旦数据从服务器返回现有数据 引用填充了实际数据。
和
资源实例和集合具有这些附加功能 属性:
$ promise:创建的原始服务器交互的承诺 这个实例或集合。
成功时,使用相同的资源实例解析promise 集合对象,使用来自服务器的数据进行更新。
因此,在调用$ resource.get()时,请务必获得类似于对空Object
或Array
的引用。只有$resource.get().$promise
,您才会收到deisred promse对象。