【发布时间】:2014-03-01 22:49:42
【问题描述】:
ngResource 看起来是一种在 RESTful(或至少受 REST 启发)Api 中管理数据访问的非常方便的方法......但我想使用它管理的一些数据是只读的(至少从我的应用程序的视角)。
有什么办法可以防止ngResource返回的对象添加save、remove和delete方法?就文档而言,它看起来像是一个唯一的附加 API...
【问题讨论】:
标签: angularjs ngresource
ngResource 看起来是一种在 RESTful(或至少受 REST 启发)Api 中管理数据访问的非常方便的方法......但我想使用它管理的一些数据是只读的(至少从我的应用程序的视角)。
有什么办法可以防止ngResource返回的对象添加save、remove和delete方法?就文档而言,它看起来像是一个唯一的附加 API...
【问题讨论】:
标签: angularjs ngresource
代替:
var Car = $resource('/cars');
var myCar = new Car();
myCar.color = 'red';
myCar.$save();
做:
var Car = $resource('/cars');
var myCar = {};
myCar.color = 'red';
Car.save(myCar);
还有:
var Car = $resource('/cars/:id');
var myCar = Car.query({id: 52});
那么您将永远不必看到那些$-methods/properties。
【讨论】:
Car.save Car.delete 等。我不知道如何,但我非常想自己替换默认方法。我现在也在调查...
我认为这不可能,因为源代码如下所示:
var DEFAULT_ACTIONS = {
'get': {method: 'GET'},
'save': {method: 'POST'},
'query': {method: 'GET', isArray: true},
'remove': {method: 'DELETE'},
'delete': {method: 'DELETE'}
};
和:
actions = extend({}, DEFAULT_ACTIONS, actions);
function extractParams(data, actionParams) {
var ids = {};
actionParams = extend({}, paramDefaults, actionParams);
forEach(actionParams, function(value, key) {
if (isFunction(value)) {
value = value();
}
ids[key] = value && value.charAt && value.charAt(0) == '@' ?
lookupDottedPath(data, value.substr(1)) : value;
});
return ids;
}
function defaultResponseInterceptor(response) {
return response.resource;
}
function Resource(value) {
shallowClearAndCopy(value || {}, this);
}
forEach(actions, function(action, name) {
...
对于 Angular 来说是一个很好的补充,让我们将来可以修改 DEFAULT_ACTIONS。同时你可以通过...快速修复它。
var myResource = $resource('/myresource');
delete myResource.save;
delete myResource.delete;
delete myResource.remove;
delete myResource.query;
...我猜;虽然这有点“脏”。
【讨论】:
你只需要从构造函数原型中移除实例方法:
app.factory('SomeResource', function($resource){
var r = $resource('/some/api/path');
delete r.prototype.$save;
delete r.prototype.$delete;
delete r.prototype.$remove;
return r;
});
【讨论】:
delete 按照下面的@kornfride 构造函数上的非前缀方法,例如delete r.save; delete r.prototype.$save