39 votes

Enregistrement de nouveaux modèles à l'aide d'AngularJS et de $resource

J'essaie de comprendre AngularJS en utilisant $resource, mais la plupart des exemples que je vois n'expliquent pas comment créer de nouvelles instances de quelque chose en utilisant $resource (ou à quoi doit ressembler toute la configuration). J'ai posté mon code au bas de cette page.

J'ai la configuration suivante, où l'envoi d'un message à '/entry/api' doit créer une nouvelle entrée. L'objet entrée lui-même a trois propriétés : nom, description et id.

Je pensais qu'appeler $scope.save() ; ferait deux choses :

  1. Mettez en correspondance les champs de saisie avec les données POST
  2. effectue une requête POST vers l'url définie dans la ressource $ (dans ce cas, '/entry/api').

Certains exemples que j'ai vus consistent à mettre manuellement en correspondance les données avec la ressource en tant que telle :

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

Je pensais que cela n'était pas censé être nécessaire, puisque ces champs sont définis dans le html. Cette solution a pour résultat :

  1. Définition d'un modèle dans le backend
  2. Définition d'un modèle dans le front-end (le contrôleur d'entrée) div )
  3. Ajout des valeurs du contrôleur d'entrée (entryController) div à la version JS du modèle et enfin l'enregistrer.

C'est peut-être la façon dont AngularJS fonctionne, mais je pensais que les champs de saisie dans le code html seraient automatiquement mappés.

Sinon, vous avez au moins 3 endroits dans le code à mettre à jour si vous ajoutez ou supprimez une propriété de votre modèle (backend).

Comment êtes-vous censé utiliser AngularJS avec $resource pour enregistrer de nouveaux objets ?

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>

46voto

Valentyn Shybanov Points 8483

La première chose que vous devez noter, c'est que scope != model mais la portée peut contenir un ou plusieurs modèles.

Vous devez avoir un objet dans votre scope et le sauvegarder.

Ainsi, il y aurait quelque chose comme ce qui suit :

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

Note1 : même si vous n'avez pas initialisé d'objet de sondage, AngularJS créera automatiquement un nouvel objet lorsque vous commencerez à taper.

Note2 : il est préférable d'envelopper votre formulaire dans ngForm (en ajoutant ng-form="someformname" à div avec ng-controller ou envelopper avec <form name='...'>..</form> . Dans ce cas, vous pourriez vérifier la validité du formulaire en $scope.someformname.$valid avant de sauvegarder.

Un bon exemple se trouve sur la page principale du site Web d'AngularJS, dans la section "wiring the backend" (ma préférée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X