2013-02-26 142 views
-1

我有一個非常簡單的資源如下:

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

回答

1

您不需要使用$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