2013-03-08 81 views
6

我有一個從查詢返回一個數組,像這樣的資源返回一個集合:添加方法從一個角資源查詢

.factory('Books', function($resource){ 
    var Books = $resource('/authors/:authorId/books'); 
    return Books; 
}) 

是否有可能加入原型方法,該陣列由該查詢返回? (請注意,不是array.prototype)。

例如,我想如hasBookWithTitle(title)方法添加到集合。

+0

看看這有助於[在Angular.js $資源的關係】(http://stackoverflow.com/questions/9981090/resource-relations-in-angular-js)。 – Stewie 2013-03-08 00:27:29

回答

4

這可能是用於創建擴展資源的定製服務,並增加實用方法給它,而不是默認的資源服務添加方法返回值一個很好的例子。

var myModule = angular.module('myModule', []); 
myModule.factory('Book', function() { 
    var service = $resource('/authors/:authorId/books'); 
    service.hasBookWithTitle = function(books, title){ 
     //blah blah return true false etc. 
    } 
    return service; 
}); 

然後

books = Book.list(function(){ 
    //check in the on complete method 
    var hasBook = Book.hasBookWithTitle(books, 'someTitle'); 
}) 
5

的建議從ricick是一個很好的,但如果你想真正有一個返回數組的一個方法,你將有一個更難的時間這樣做。基本上你需要做的是創建一個$資源及其實例的包裝。您碰到的問題是來自angular-resource.js的以下代碼行:

var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data)); 

這是設置$ resource的返回值的位置。在執行ajax請求時,將會填充並返回「value」。當ajax請求完成時,該值返回上面的「value」,但是通過引用(使用angular.copy()方法)。數組的每個元素(對於像query())這樣的方法都將是您正在操作的資源的一個實例。

所以,你可以擴展這一功能的方法是這樣的(未測試的代碼,所以可能沒有一些調整工作):

var myModule = angular.module('myModule', ['ngResource']); 
myModule.factory('Book', function($resource) { 
    var service = $resource('/authors/:authorId/books'), 
     origQuery = service.prototype.$query; 

    service.prototype.$query = function (a1, a2, a3) { 
     var returnData = origQuery.call(this, a1, a2, a3); 
     returnData.myCustomMethod = function() { 
      // Create your custom method here... 
     return returnData; 
     } 
    } 

    return service; 
}); 

同樣,你將不得不與它爛攤子位,但這是基本的想法。

2

綜觀角resource.js(至少在1.0.x的系列)的代碼,它不會出現,你可以在回調中添加對任何類型的默認行爲(這似乎是正確的設計對我來說)。

如果你只是使用單個控制器的值,可以在回調中傳遞時,你的資源調用query

var books = Book.query(function(data) { 
    data.hasBookWithTitle = function (title) { ... }; 
]); 

或者,您可以創建裝飾的圖書資源服務,轉發所有的調用get/query/save/etc,並用你的方法裝飾數組。例如普拉克這裏:http://plnkr.co/edit/NJkPcsuraxesyhxlJ8lg

app.factory("Books", 
    function ($resource) { 
    var self = this; 
    var resource = $resource("sample.json"); 

    return { 
     get: function(id) { return resource.get(id); }, 
     // implement whatever else you need, save, delete etc. 
     query: function() { 
     return resource.query(
      function(data) { // success callback 
      data.hasBookWithTitle = function(title) { 
       for (var i = 0; i < data.length; i++) { 
       if (title === data[i].title) { 
        return true; 
       } 
       } 
       return false; 
      }; 
      }, 
      function(data, response) { /* optional error callback */} 
     ); 
     } 
    }; 
    } 
); 

第三,我覺得這是更好,但它取決於你的需求,你可以採取功能性做法,並把hasBookWithTitle功能控制器上,或者如果邏輯必須在公用事業服務中共享。