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)集合之类的方法.
来自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)
再一次,你将不得不捣乱它,但这是基本的想法.
这可能是创建扩展资源的自定义服务并向其添加实用方法的好例子,而不是向默认资源服务的返回值添加方法。
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)