1

我正在开发一个简单的 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];
     })

尽管我今天学习了 Promise,也许我误解了一些东西,但这段代码看起来很简单。

问题是,当我尝试分配currentYear的第一个元素时timefilters.years,分配失败,因为数组仍然是空的,即使它不应该是,因为我试图在.then函数中分配。结果是下拉列表中填充了年份,但没有选择年份。

我在这里误会了什么?

顺便说一句,资源调用返回预期的数据,所以这不是问题。

编辑:就在发布后,我将第一个返回语句更改then为:

return TimeFilters.get({...}).$promise

现在它可以正常工作了。但我认为 $resource.get 是为了返回一个承诺。我真的很困惑。有人可以澄清一下吗?

4

1 回答 1

1

Angular $resources 文档有答案:

重要的是要意识到调用 $resource 对象方法会立即返回一个空引用(对象或数组取决于 isArray)。从服务器返回数据后,现有参考将填充实际数据。

和:

Resource 实例和集合具有以下附加属性:

$promise:创建此实例或集合的原始服务器交互的承诺。

成功后,promise 将使用相同的资源实例或集合对象解析,并使用来自服务器的数据进行更新。

因此,当调用 $resource.get() 时,确实希望得到类似空的引用ObjectArray. 只有与您在一起,$resource.get().$promise您才能收到所希望的承诺对象。

于 2014-04-01T15:53:32.390 回答