Сохранение новых моделей с использованием ресурсов AngularJS и $

Я пытаюсь понять AngularJS с использованием $resource, однако большинство примеров, которые я вижу там, не объясняют, как на самом деле создавать новые экземпляры чего-либо с помощью $resource (или как должна выглядеть вся установка), Я разместил свой код внизу.

У меня есть следующая настройка, где размещение в /entry/api должно создать новую запись. Объект записи сам имеет три свойства: имя, описание и идентификатор.

Я думал, что вызов $ Scope.save(); будет делать две вещи:

  • Сопоставьте поля ввода как данные POST
  • сделать запрос POST на url, определенный в ресурсе $(в данном случае '/entry/api')

Некоторые примеры, которые я видел, вручную сопоставляют данные с ресурсом как таковым:

var entry = new Entry();
entry.name = $name; // defined in entryController
entry.description = $scope.description; // <-- defined in entryController
entry.$save()

Я думал, что это не должно быть необходимым, так как эти поля определены в html. Это решение приводит к:

  • Определение модели в бэкэнд
  • Определение модели в интерфейсе (entryController div)
  • Добавление значений из элемента entryController div в JS-версию модели и затем, наконец, ее сохранение.

Это может быть способ работы AngularJS, однако я думал, что поля ввода в html будут автоматически отображены.

В противном случае у вас есть как минимум 3 места в обновляемом коде, если вы добавите или удалите свойство вашей (бэкэнд) модели.

Как вы можете использовать AngularJS вместе с $resource для сохранения новых объектов?

angular.module('entryManager', ['ngResource']);

function pollController($scope, $resource) {
    $scope.polls = $resource('/entry/api/:id', {id: '@id'});

    $scope.saveEntry = function() {
        this.save();
    }
}


<html ng-app="entryManager">
... <-- include angularjs, resource etc.

<div ng-controller="entryController">
    <input type='text' ng-model="name"><br/>
    <textarea ng-model="description" required></textarea><br/>
    <button class="btn btn-primary" ng-click="saveEntry()">Save</button>
</div>

Ответ 1

Первое, что вы должны отметить, что scope != model, но область может содержать модель (ы).

У вас должен быть какой-то объект в вашей области действия, а затем сохранить его.

Итак, будет что-то вроде следующего:

HTML:

<div ng-controller="entryController">
    <input type='text' ng-model="poll.name"><br/>
    <textarea ng-model="poll.description" required></textarea><br/>
    <button class="btn btn-primary" ng-click="saveEntry()">Save</button>
</div>

JavaScript:

function pollController($scope, $resource) {
    var polls = $resource('/entry/api/:id', {id: '@id'});

    $scope.saveEntry = function() {
        polls.save($scope.poll);
    }
}

Примечание1:, даже если у вас нет инициализированного объекта опроса, AngularJS автоматически создаст новый объект при вводе текста.

Примечание2: лучше всего добавить свою форму в ngForm (добавив атрибут ng-form="someformname" в div с ng-контроллером или обернуть с помощью <form name='...'>..</form>). В этом случае вы можете проверить правильность форма $scope.someformname.$valid перед сохранением.

Хороший пример находится на главной странице веб-сайта AngularJS в разделе "Проводка бэкэнд" (кстати, мой любимый).

Ответ 2

Не используйте метод сохранения поверх самого объекта модели, используйте метод сохранения класса модели, например -

//inject User resource here
$scope.user = new User();

$scope.user.name = "etc";

User.save($scope.user,function(response){

});

ранее я использовал $scope.user.$save(function(response){}), он очищал мой объект $scope.user