从Angular JS $资源返回的值POST不匹配服务器输出

时间:2013-06-11 11:30:08

标签: angularjs

我的资源工厂有一个名为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更新后的StarId返回值,请注意它是如何“0”:

enter image description here enter image description here

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

1 个答案:

答案 0 :(得分:3)

您的var updated = Feed.update(post);对服务器进行异步调用并立即返回,并在服务器返回数据后立即更新updated对象。所以我想你尝试过早访问updated.StarId。来自angular doc

  

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

尝试这样的事情:

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