2013-01-14 2 views
0

J'essaie d'ajouter la fonctionnalité à mon application afin que je puisse mettre à jour ma base de données, puis mettre à jour le DOM. La base de données est bien mise à jour, mais pas le DOM. Voici une partie de mon avis:Backbone: Mise à jour n'appelant pas la fonction de rappel

App.Views.Table = Backbone.View.extend({ 
    tagName: 'span', 
    initialize: function(options) { 
     this.model.on('change', this.render, this); 
     this.model.on('update', this.remove, this); 

     this.template = this.options.template; 
     this.url = this.options.url; 
    }, 
    events: { 
     'click .verify': 'verify', 
     'click .spam': 'spam', 
     'click .duplicate': 'duplicate' 
    }, 
    verify: function(e) { 
     id = e.currentTarget.id; 
     table = new App.Models.Table({ id: id }); 
     table.urlRoot = this.url; 
     table.fetch(); 
     table.toJSON(); 
     table.set('verified', 1); 
     table.save(); 

    }, 
    spam: function(e) { 
     ... 

    }, 
    duplicate: function(e) { 
      ... 
    }, 
    remove: function() { 
     this.$el.remove(); 
     console.log('hello'); 
    }, 
    retrieveTemplate: function(model) { 
     return _.template($('#' + this.template).html(), model); 
    }, 
    render: function() { 
     //console.log(this); 
     this.$el.html(this.retrieveTemplate(this.model.toJSON())); 
     return this; 
    } 
}); 

Si je comprends bien, this.model.on('update', this.remove, this); devrait appeler ma fonction de suppression lorsque save est terminée. Mais le rappel ne se déclenche pas car je n'obtiens pas le console.log et mon DOM n'est pas mis à jour. Qu'est-ce que je fais mal? J'ai suivi un tutoriel, mais tout fonctionne bien dans le tutoriel.

+0

J'ai aussi essayé 'create' au lieu de' update' et toujours pas de chance. – sehummel

+0

table.toJSON(); - Cette ligne de code ne fait rien BTW. Vous devez faire quelque chose avec le JSON qu'il retourne. – asgeo1

Répondre

2

Il n'y a pas d'événement update. Je pense que vous voulez dire sync

http://backbonejs.org/#Events-catalog

"sync" (model, resp, options) — when a model has been successfully synced with the server.

également un coup utile pour le débogage que j'ai trouvé à l'aide de l'événement all pour voir quels événements se déclenche.

Edit:

Après un certain débogage, l'objectif de la fonction verify() était de sauver l'attribut vérifié au modèle. Pour ce faire, nous avions besoin de changer verify() à

this.model.set('verified', 1); 
this.model.save(); 

au lieu de créer une nouvelle App.Model.Table et la mise à la variable table. Faire table .save() était d'enregistrer le nouveautable modèle, au lieu de l'ancien modèle, this.model. C'est pourquoi les gestionnaires d'événements attachés à this.model étaient déclenchés par le réseau.

+0

J'ai essayé 'this.model.on ('sync', this.remove, this)', est-ce correct? Ça ne fonctionne pas. – sehummel

+0

peut-être que vous obtenez une erreur lorsque vous essayez de synchroniser? dans ce cas, vous devez vous abonner à l'événement 'error' – hajpoj

+0

OK. Je vais essayer ça. – sehummel

0

Il n'y a pas d'événements "créer" ou "mettre à jour" dans Backbone.js. C'est pourquoi votre rappel remove() ne se déclenche pas.

Voir http://backbonejs.org/#Events-catalog pour un catalogue des événements possibles dans Backbone.

MISE À JOUR:

Après avoir regardé votre code plus près, la réponse est claire. Ils sont différents modèles:

initialize: function(options) { 
    this.model.on('change', this.render, this); 
    this.model.on('sync', this.remove, this); 

et

table = new App.Models.Table({ id: id }); 
... 
table.save(); 

Les événements qui se produisent sur votre objet table ne vont pas déclencher des gestionnaires d'événements qui sont liés à un modèle totalement différent (de this.model). Pourquoi créer un autre modèle (table) quand vous avez déjà eu un modèle?

(ce modèle) ?

* MISE À JOUR *

Je ne comprends pas vraiment ce que vous essayez de faire, mais peut-être essayer ceci:

table = new App.Models.Table({ id: id }); 
table.on('sync', this.remove, this); 
+0

Ok. Est-ce que je fais 'this.model.on ('sync', this.remove, this);'? – sehummel

+0

@sehummel Ouais, ça devrait se déclencher sur une sauvegarde réussie() .Si ça ne se déclenche pas, il doit y avoir une erreur – asgeo1

+0

Des pensées sur ce que cela pourrait être? Peut-être que ce n'est pas le modèle? – sehummel

Questions connexes