ngResource自定义模型操作

时间:2016-02-23 01:43:39

标签: angularjs

我使用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一起存储,或者这样的自定义操作是否需要来自其他地方?如果可能的话,我想将模型相关的操作放在一起。

1 个答案:

答案 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。