4

我有一个资源工厂,带有一个名为 update 的 POST 方法:

PnrApp.factory('Feed', function ($resource, $cacheFactory, $q, $rootScope) {
var Feed = $resource('api/feeds/:post', { post: 'post' }, {
            get: { method:'GET' },  
            update: { method: 'POST' }

        });
return Feed;

});

当我调用该方法时,它会按预期将数据发布到服务器:

    $rootScope.toggleStar = function (post, feedname) {
    var updated = Feed.update(post);
    this.child.StarId = updated.StarId;
}

服务器返回正确的值(注意这个 json 中的 StarId):

{"Name":"13 Ways to Act Like A Business Owner","ItemDate":"June 6, 2013","Url":"/post/13-Ways-to-Act-Like-A-Business-Owner-Stop-Acting-Like-an-Advisor-All-the-Time-(6-min-03-sec).aspx","StarImg":"bulletstar-on.png","StarId":1324,"StarDate":"0001-01-01T00:00:00","FeedCount":0,"FeedId":19,"SourceIcon":null,"IsBroken":false,"ItemId":"01"}

但是,如果您查看 var updated 对 StarId 的返回值,请注意它是“0”:

在此处输入图像描述 在此处输入图像描述

有人可以解释为什么会这样,以及在这种情况下我如何获得返回值?

4

1 回答 1

3

var updated = Feed.update(post);对服务器进行异步调用并立即返回,并且updated一旦服务器返回数据,对象就会更新。所以我猜你尝试访问 updated.StarId 太早了。从角度文档

重要的是要意识到调用 $resource 对象方法会立即返回一个空引用(对象或数组取决于 isArray)。从服务器返回数据后,现有参考将填充实际数据。这是一个有用的技巧,因为通常将资源分配给模型,然后由视图呈现。拥有一个空对象不会导致渲染,一旦数据从服务器到达,那么该对象就会被数据填充,并且视图会自动重新渲染自身以显示新数据。这意味着在大多数情况下,人们永远不必为操作方法编写回调函数。

尝试这样的事情:

$rootScope.toggleStar = function (post, feedname) {
  var updated = Feed.update(post, function(f) {
    this.child.StarId = f.StarId;
  });      
}
于 2013-06-11T19:40:37.910 回答