$资源不更新视图

$资源不更新视图

问题描述:

我有一个非常简单的资源如下:

angular.module('ExampleServices', ['ngResource']). 

     factory('NoteService', function($q, $rootScope, $resource){ 
     var baseurl = "/api/v1/note/"; 
     var Note = $resource(baseurl, {}, { 

      // get notes method  
      get_for_model: { 
       method: 'GET', 
       params:{user: '', object_id: ''}, 
       isArray: false 
      }, 

      // leave note method 
      leave_note: { 
       method: 'POST', 
      } 

     }); 
     return Note 
    } 
); 

和控制器内我称之为leave_note方法如下:

$scope.note = function(){ 
     $scope.note = NoteService.leave_note({ 
      desc: desc, 
      title: title, 
      object_id: oid, 
     }); 
    } 

这基本上调用POST方法到我的应用程序rest API和对象被创建。一旦页面刷新,我可以看到notes中列出的注释。但据我所知$resource应自行更新视图。从docs

重要的是

报价意识到调用$资源对象方法立即返回一个空引用(对象或数组取决于IsArray的)。一旦从服务器返回数据,现有参考将填入实际数据。

我不能够使用$rootScope.$applyleave_note方法中,直到我把它定义为一个功能(如下:)

leave_note: function(){ 
    var note = New Note(); 
    note.desc = desc; 
    note.title = title; 
    note.object_id = oid; 
    note.$save(); 
    $rootScope.$apply(); 
} 

但在上述情况下,呼叫发送到REST API有undefined请求方法。

我可以想到的另一个问题是,我没有$scope.note定义,但有$scope.notes这是由REST api发送的笔记列表。因此,$scope.note可能正在更新中,但由于我没有在模板中呈现note对象,但呈现notes使用ng-repeat,因此我无法看到模板中的更改。

我还尝试在保存新笔记后重新获取笔记对象,但它基本上删除了所有笔记,然后重新呈现所有看起来很难看的笔记(几乎像刷新页面一样)。

我试图实现的目标是保存一个note对象,我希望将新音符合并到现有音符中。请指导我。谢谢

+0

downvoter?请解释你的downvote。 – Amyth 2013-02-26 10:54:22

您不需要使用$rootScope.$apply,您错过了解$resource API文档。

正如$resource文档中提到的:“一旦数据从服务器返回,现有引用就会填充实际数据。”。这意味着当您执行$scope.notes = NoteService.get_for_model();时,您要求使用从NoteService.get_for_model GET请求收到的(未来)数据填充$scope.notes$resource API将负责完成此操作 - 更新$scope.notes模型 - 仅此而已。请注意,没有提及,当您在同一服务上进行POST时,您的数据将自动更新。

如果你想添加一个新的笔记(POST)后更新您的$scope.notes模型,并且不希望请求将整个笔记列表,请尝试直接添加新的记录到你$scope.notes模型在POST 成功回调:

var note = NoteService.leave_note({ 
      desc: desc, 
      title: title, 
      object_id: oid, 
     }, function() { 
      $scope.notes.push(note.$get());     
     } 
); 

注意,这可以大大提高(即避免$get),但因为我不知道你的实现的具体细节,我只是提供了一个通用的解决方案。

+0

感谢您抽出时间回复。我实际上最终使用了'$ scope.notes.push(note)',它确实更新了数据。干杯! – Amyth 2013-02-26 12:45:19