【问题标题】:Using Restangular, can I use a jsonResultsAdapterProvider when needing to override the id field?使用 Restangular,我可以在需要覆盖 id 字段时使用 jsonResultsAdapterProvider 吗?
【发布时间】:2015-07-02 10:44:58
【问题描述】:

我有一个带有非标准 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}(但 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;
});

但是这弄乱了 url,导致缺少 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”?关于我可以尝试如何让保存工作的任何想法?

【问题讨论】:

    标签: restangular


    【解决方案1】:

    我终于明白了!问题出在我的配置代码和我的 decamelizing 方式中。由于我的数据库字段名称不一致(大多数使用下划线,但有些已经是驼峰式),我将服务器的原始elem 名称存储在jsonResultsAdapterProvider 内的一个数组中。但是由于我在拦截器中调用jsonResultsAdapterProvider.$get().camelizeKeys(extractedData);,所以每次发出新请求时我都会重新实例化数组。因此,PUT 请求中的 undefined 来自我的 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);
    });
    

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 2023-03-08
      • 2011-05-06
      • 1970-01-01
      • 2015-01-29
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多