J'ai un modèle qui peut être édité par une certaine vue; Toutefois, au bas de la vue, l'utilisateur doit pouvoir enregistrer ou ignorer toutes les modifications. Cela signifie que vous devrez enregistrer une liste de toutes les modifications à apporter au modèle, puis ne les apporter que lorsque le bouton "Enregistrer" aura été cliqué. Cela semble inutilement compliqué et j'ai proposé une approche alternative consistant à créer un clone du modèle et à y apporter des modifications. Ensuite, si l'utilisateur clique sur "Enregistrer", supprime l'ancien modèle et le remplace dans sa collection par le nouveau, sinon vous supprimez le modèle cloné.
Ceci est une approche acceptable, et si oui, comment puis-je mettre en œuvre le processus de clonage?
Cela équivaudrait à récupérer les données du serveur à nouveau (mais une requête HTTP supplémentaire semble inutile).
Vous pouvez utiliser la méthode clone
. Petit exemple ci-dessous:
var Model = Backbone.Model.extend({});
var View = Backbone.View.extend({
initialize: function() {
this.realModel = this.model;
this.model = this.realModel.clone();
},
onSave: function() {
this.realModel.set(this.model.attributes);
}
});
Vous pouvez également faire quelque chose d'un peu différent:
var Model = Backbone.Model.extend({});
var View = Backbone.View.extend({
initialize: function() {
// save the attributes up front, removing references
this._modelAttributes = _.extend({}, this.model.attributes);
},
onSave: function() {
// revert to initial state.
this.model.set(this._modelAttributes);
}
});
Vous pouvez donner Backbone.Memento à essayer.
Si vous ne voulez pas l'utiliser, pas de problème. Mais, vous pouvez avoir une bonne idée de la façon dont cela devrait être fait à partir de la base de code.
Je résous généralement ce problème avec un cache d'objets sur la vue. De cette façon, je n’ajoute aucune surcharge inutile à la gestion des modèles/vues. L'élimination se produit naturellement si l'utilisateur se ferme hors d'une vue sans enregistrer.
var Model = Backbone.Model.extend({
'title': 'Hello'
});
var View = Backbone.View.extend({
initialize: function() {
// Holds temporary values until save
this.cache = {};
},
onTitle: function() {
this.cache.title = 'World';
},
onSave: function() {
this.model.set( this.cache );
}
});