我使用ngResource在我的Ionic / Angular应用程序中处理我的模型,而且我无法弄清楚如何/是否可以对资源进行自定义操作。
我将我的模型实例存储在本地存储中,当我更新记录时,我也希望更新本地存储。我有这个工作,但我不得不复制和粘贴多个实例的代码,并希望保持干燥。
LogEntry.update($scope.timeLog, function(data) {
// update local storage
for ( var i = 0; i < logEntries.length; i++) {
if(logEntries[i].id == $scope.timeLog.id){
logEntries[i] = $scope.timeLog;
}
};
localStorageService.set('LogEntries', logEntries);
});
这是我更新记录的情况,在promise返回后我更新了本地存储。我想让这个可重复,我如何设想它是可能的(基于我在其他框架和其他语言中看到的其他东西)是这样的:
LogEntry.update($scope.timeLog, function(data) {
// update local storage
LogEntry.updateLocalStorage($scope.timeLog);
});
我的资源如下:
.factory('LogEntry', function(config, $resource) {
return $resource(config.apiUrl + 'logentries/:id/', {}, {
'update': {
method:'PUT',
params: { id: '@id' }
}
});
})
也许我错过了docs中的某些内容,但它很短暂,而且我没有找到办法做到这一点。像LogEntry.updateLocalStorage($scope.timeLog);
这样的东西是否可以与ngResource一起存储,或者这样的自定义操作是否需要来自其他地方?如果可能的话,我想将模型相关的操作放在一起。
答案 0 :(得分:0)
您可以在资源定义中使用transformResponse
方法。这是一种黑客攻击,因为您实际上并不需要更改响应,但它允许您使用返回的数据执行操作:
{function(data, headersGetter)|Array.<function(data, headersGetter)>}
转换函数或此类函数的数组。 transform函数接受http响应主体和头部并返回其转换(通常是反序列化)版本。默认情况下,transformResponse将包含一个函数,该函数检查响应是否类似于JSON字符串,并使用angular.fromJson对其进行反序列化。要防止此行为,请将transformResponse设置为空数组:transformResponse:[]
https://docs.angularjs.org/api/ngResource/service/$resource
.factory('LogEntry', function (config, $resource) {
return $resource(config.apiUrl + 'logentries/:id/', {}, {
'update': {
'method': 'PUT',
'params': {
'id': '@id'
},
'transformResponse': function (data, header) {
// do stuff with data
return data;
}
}
});
})
这样一来,当你收到回复时它总是会执行,但你也可以使用transformRequest
方法,无论你是否收到回复,它都会随时触发。
{function(data, headersGetter)|Array.<function(data, headersGetter)>}
转换函数或此类函数的数组。 transform函数接受http请求主体和头部并返回其转换(通常是序列化)版本。默认情况下,transformRequest将包含一个函数,该函数检查请求数据是否为对象并使用angular.toJson进行序列化。要防止此行为,请将transformRequest设置为空数组:transformRequest:[]
https://docs.angularjs.org/api/ngResource/service/$resource
您选择哪个取决于您的用例。使用transformRequest
即使远程关闭也可以保存到localstorage。