Je pense que cela semble être une question évidente, mais mon cerveau semble un peu frit.

J'ai une ressource

Book = $resource("/books/:id", {id: "@id"});
book = Book.get(1);

Je souhaite actualiser l'objet pour obtenir des modifications du serveur. Je sais que je peux le faire en répétant book = Book.get(book.id), mais cela signifierait que tout sur la page qui regarde book serait temporairement annulé jusqu'à ce que la requête soit renvoyée et que les fonctions qui opèrent dessus se bloquent.

Je veux ajouter une méthode de rechargement aux instances qui met à jour les champs modifiés une fois la requête renvoyée par le serveur. Jusqu'à présent, ma meilleure tentative est:

$reload = function() {
    var model = this;

    Book.get(model.id, function(data) { // success
      angular.forEach(data, function(value, key) {
          model[key] = value;
      }
    }
}

Deux questions a) Est-ce la façon "angulaire" de le faire ou existe-t-il une manière plus élégante? a) Comment ajouter cette méthode $ refresh lors de la définition de la ressource afin qu'elle soit incluse dans chaque instance créée?

3
ChrisJ 18 juil. 2015 à 15:14

2 réponses

Meilleure réponse

Essayez d'étendre son prototype:

var Book = $resource("/books/:id", {id: "@id"});
Book.prototype.reload = function(callback) {
    return this.get(this.id, callback);
}

var book = Book.get(1);
book.reload(function(data){console.log(data);});

Merci à: @ mathew-berg (Mathew Berg) pour avoir corrigé mon code.

2
num8er 18 juil. 2015 à 14:26

La solution de @ num8er ne fonctionnerait même pas sans planter pour moi. Peut-être que nous utilisons différentes versions d'angular? (Je suis sur 1.4.x pour le moment.) En particulier, j'ai dû changer get() en $get(), mais je cherchais également à recharger l'objet sans avoir à passer un rappel personnalisé pour capturer de partout où j'ai appelé recharger, j'ai donc ajouté cela à la partie intérieure.

Je devais faire:

var Book = $resource("/books/:id", {id: "@id"});
Book.prototype.reload = function() {
    var book = this;
    book.$get(book.id, function (new_book) {
        book = new_book;  // replace old book object with newly reloaded one
    });
};

var book = Book.get(1);
book.reload();
0
Nathan 23 sept. 2015 à 13:57