2015-07-02 15 views
0

我有一个mySql数据库与非标准的ID和字段名称,所以我试图使用jsonResultsAdapterProvider和setRestangularFields。这里是我的app.config文件中的代码:使用Restangular,当需要重写id字段时,可以使用jsonResultsAdapterProvider吗?

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); 
}); 

这一切都很好,直到我尝试做一个put/save。当我查看浏览器开发工具中的请求负载时,它是:{"undefined":12842}(但url正确,所以我知道该id已设置)如果我不使用ResultsAdapter并将id字段更改为Person_ID,则负载看起来不错,所以我知道我正在调用Get和Save the 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”保存期间的某些点?任何想法,我可以尝试让保存工作?

回答

0

我终于明白了!问题出在我的配置代码中,并且是以我的方式去除。由于我的数据库字段名称(大多数使用下划线,但有些已经是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); 
}); 
相关问题