将方法添加到角度资源查询返回的集合

Mar*_*itt 6 javascript angularjs

我有一个从查询返回数组的资源,如下所示:

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

是否可以将原型方法添加到从此查询返回的数组中?(注意,不要array.prototype).

例如,我想添加诸如hasBookWithTitle(title)集合之类的方法.

Jas*_*den 5

来自ricick的建议很好,但如果你想在返回的数组上实际拥有一个方法,那么你将很难做到这一点.基本上你需要做的是创建一个围绕$ resource及其实例的包装器.您遇到的问题是来自angular-resource.js的这行代码:

var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data));
Run Code Online (Sandbox Code Playgroud)

这是$ 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;
});
Run Code Online (Sandbox Code Playgroud)

再一次,你将不得不捣乱它,但这是基本的想法.


ric*_*ick 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;
});
Run Code Online (Sandbox Code Playgroud)

然后

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