ngResource retrive уникальный идентификатор из POST response после $save()


Итак, у меня есть ресурс, определенный следующим образом:

angular.module('questionService', ['ngResource'])
.factory('QuestionService', function($http, $resource) {
    var QuestionService = $resource('/api/questions/:key', {}, {
        query: {
            method:'GET', 
            isArray:true,
        },
        save: {
            method: 'POST',

        }
    });

    return QuestionService
});

А позже я беру некоторую форму ввода и делаю следующее

var newQ = {
    txt: $scope.addTxt
};

QuestionService.save(newQ)

Сервер отвечает на запрос POST как путем повторного выпуска JSON для объекта, так и путем установки заголовка location с новым уникальным идентификатором. Проблема в том, что Angular не сохраняет возвращенный JSON или заголовок location в объект, и он не устанавливается с идентификатором от сервера для будущих операций. Я пробовал много вещей, таких как как:

transformResponse: function(data, headersGetter) {
    locationHeader = headersGetter().location;
    key = locationHeader.split('/').slice(-1)[0];
    data.key = key;
    return data;
}

Однако возвращенный элемент данных, похоже, не используется. Я что-то упустил? Это кажется довольно распространенным случаем использования для взаимодействия с REST api.

Спасибо!

2 4

2 ответа:

Вам нужно иметь обработчик успеха, чтобы назначить новый идентификатор newQ вручную:

QuestionService.save(newQ, function(data) {
    newQ.id = data.id;
});
Но есть и лучший способ добиться того же самого. Поскольку ваш QuestionService является объектом класса ресурсов, вы можете создать экземпляр вашего newQ следующим образом:
var newQ = new QuestionService({text: $scope.addTxt});

Затем вызовите $save() из newQ:

newQ.$save();

Теперь newQ должен иметь новый идентификатор, возвращаемый сервером.

У меня есть Asp.Net сервер с WebApi2 работает, я использую Ok (число) для возврата содержимого, и он возвращает, например, '6' в результате. как только он возвращается, angular показывает объект, содержащий обещание и состояние, прототипы и глубокую повторяющуюся иерархию, но без значения, без "6". Поэтому я пошел посмотреть, куда идут данные, чтобы увидеть, где находятся данные, я определяю преобразование, и я вижу awo данные, но это не json...

Позже я изменяю его на following, и теперь у меня есть obj в моей функции успеха, которая имеет свойство sub под названием 'returnValue' (как я определил), и этот объект содержит мое значение.

transformResponse: function(data, header){
    var obj={};
    obj.returnValue=angular.fromJson(data);
    return obj;
},