Элементы исчезают при сохранении

Я создал директиву для отображения данных. Я могу включить его в ng-repeat и увидеть, что модель подключена. Когда я ухожу и возвращаюсь на страницу, данные снова отображаются с ранее внесенными изменениями. Я использовал ngResources для загрузки данных из API. Пока все хорошо: работает как положено.

Вот часть, которая ломается: если я сохраняю данные в API в своей директиве, элемент исчезает со страницы (точнее, он рисуется с пустыми полями). Остальные пункты остаются прежними. Меняется только сохраненный.

Вот директива:

.directive('action', function() {
    return {
        restrict: 'E',
        scope: {
            data:'=model'
        },
        templateUrl: 'modules/actions/view.tpl.html',
        replace: true,
        link: function(scope, element, attr) {
            scope.save = function() {
                console.log(" data to save:" + JSON.stringify(scope.data));
                scope.data.$save();
            }
        }
    };
})

HTML-код, связанный с директивой, включает:

<p><input type="text" ng-model="data.assignee" ng-change="save()">

Вот как использовалась директива:

<div ng-repeat="item in data">
  <action model="item" />
</div>

Вот скрипка, которая показывает дополнительный контекст. Вы можете увидеть базовую директиву, работающую с некоторыми поддельными данными. Код вызова API закомментирован.

Опять же, проблема возникает, когда строка scope.data.$save(); не закомментирована. Когда элемент, отображаемый в ng-repeat, пытается сохранить себя, он исчезает из отображаемого списка элементов, заменяясь одним с пустыми полями. Когда я перезагружаю все приложение, я вижу, что сохранение API прошло успешно, и элемент теперь отображается правильно.

Я подозреваю, что происходит то, что вызов сохранения работает с правильным элементом, но каким-то образом заменяет измененный элемент новым, пустым, возможно, из-за прототипного наследования. Затем сохранение вызывает обновление родительской области, в результате чего список перерисовывается и отображается новый незаполненный элемент.

Может кто-нибудь прояснить, что происходит и как это исправить?


person CodeGuy2001    schedule 04.09.2013    source источник


Ответы (1)


Я думаю, вы обнаружите, что ответ HTTP на вашу команду $save() возвращает пустые данные.

Вот как работает $resource. Когда вы вызываете $save(), он (по умолчанию) вызывает вашу службу REST с помощью HTTP POST. Ожидается, что ответ будет состоянием сервера ресурса. Затем результат копируется в ваш объект. В этом случае я предполагаю, что ваша служба REST возвращает пустой объект.

Другими словами, если вы отправляете POST с телом {name: 'foo'}, вы ожидаете, что ответ от сервера будет что-то вроде {id: 44, name: 'foo', extraInfoServerCreated: 'bar'}.

person Brian Genisio    schedule 05.09.2013
comment
Ты прав. Когда сервер возвращает сохраненные данные, проблема полностью решается. Спасибо! - person CodeGuy2001; 06.09.2013
comment
Или верните пустой ответ, если это проще, поскольку это заставит использовать исходный элемент вместо данных ответа. - person cyberwombat; 31.01.2014
comment
@Yashua Ты уверен? Я думал, что Angular $resource заменяет данные тем, что вы возвращаете из службы REST... поэтому, если вы вернетесь пустым, он очистит вашу модель. - person Brian Genisio; 31.01.2014
comment
@BrianGenisio да - я только что сам столкнулся с проблемой и разместил сообщение на SO - я возвращал «ok», что все испортило - после возврата только кода состояния 200 Angular начал использовать исходный элемент. Так что это либо просто код состояния, либо новая версия элемента, который должен быть возвращен, и ничего больше. См. мой сценарий здесь: stackoverflow.com/questions/21471059/ - person cyberwombat; 31.01.2014