我有一个带有非标准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期间的某个时刻?关于我可以尝试保存工作的任何想法?
答案 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);
});