使用Restangular,我可以在需要覆盖id字段时使用jsonResultsAdapterProvider吗?

时间:2015-07-02 10:44:58

标签: restangular

我有一个带有非标准ID和字段名称的mySql数据库,因此我尝试使用jsonResultsAdapterProvider和setRestangularFields。这是我的app.config文件中的代码:

RestangularProvider.setBaseUrl(remoteServiceName);
RestangularProvider.setRestangularFields({id: 'personID'});
RestangularProvider.addResponseInterceptor(function(data, operation, what, url, response, deferred) {
    if (data.error) {
        return data.error;
    }
    var extractedData = data.result;
    return jsonResultsAdapterProvider.$get().camelizeKeys(extractedData);
});

RestangularProvider.addRequestInterceptor(function(elem, operation, what, url) {
    return jsonResultsAdapterProvider.$get().decamelizeKeys(elem);
});

在我尝试进行存储/保存之前,这一切都很好。当我在浏览器开发工具中查看请求有效负载时,它是:{"undefined":12842}(但网址是正确的,所以我知道ID已设置)如果我不使用ResultsAdapter和将id字段更改为Person_ID,有效负载看起来很好,所以我知道我正在调用Get和Save Restangular对象。但是对于它的价值,这里是代码:

$scope.tests = Restangular.all('members').getList().$object;
vm.testEdit = function () {
    $scope.test = Restangular.one('members', 12842).get().then(function(test) {
        var copy = Restangular.copy(test);
        copy.title = 'xxxx';

        copy.put();  // payload was: undefined: 12842
    });
}

// I also tried customPUT...
// copy.customPUT(copy, '', {}, {'Content-Type':'application/x-www-form-urlencoded'});

我试过"修复" id也是其他方式。像这样:

Restangular.extendModel('members', function(model) {
  model.id = model.personID;
  return model;
});

但这弄乱了网址,导致缺少ID。我尝试了getIdFromElem,但只调用了Restangular.one()创建的对象,而不是Restangular.all()

Restangular.configuration.getIdFromElem = function(elem) {
    console.log('custom getIdFromElem called');
    if (elem.route === 'members') {  // this was never true
        return elem[personID];
    }
};

似乎Restangular需要替换'personID'大部分时间,但也许它需要' Person_ID'在Save期间的某个时刻?关于我可以尝试保存工作的任何想法?

1 个答案:

答案 0 :(得分:0)

我终于明白了!问题出在我的配置代码和我的decamelizing方式。由于我的db字段名称不一致(大多数使用下划线,但有些已经是camelCase),我将服务器的原始elem名称存储在jsonResultsAdapterProvider内的数组中。但是因为我在拦截器中调用jsonResultsAdapterProvider.$get().camelizeKeys(extractedData);,所以每次发出新请求时我都会重新实例化该数组。因此,PUT请求中的未定义来自我的decamelizeKeys()方法。

我更新的配置代码修复了问题:

RestangularProvider.setBaseUrl(remoteServiceName);
RestangularProvider.setRestangularFields({id: 'personID'});
var jsonAdapter = jsonResultsAdapterProvider.$get();
RestangularProvider.addResponseInterceptor(function(data, operation, what, url, response, deferred) {
  if (data.error) {
    return data.error;
  }
  var extractedData = data.result;
  // return extractedData;
  return jsonAdapter.camelizeKeys(extractedData);
});

RestangularProvider.addRequestInterceptor(function(elem, operation, what, url) {
  return jsonAdapter.decamelizeKeys(elem);
});