2013-10-15 2 views
2

Je dois dire si le modèle à l'intérieur de l'événement add a été récupéré avec collection.fetch ou créé par collection.create. C'est possible?Est-il possible de savoir lequel a déclenché l'événement add de Collection: fetch ou create call?

collection.on('add', onModelAdded) 
collection.fetch() 
collection.create({}) 

function onModelAdded(model, collection, options) { 
    // created or fetched? 
} 
+1

Avez-vous essayé de remplacer 'create' pour ajouter quelque chose à travers les' options'? –

+0

@muistooshort bonne idée, en essayant de l'implémenter dès maintenant. –

+0

@muistooshort cela a fonctionné, merci. Veuillez poster une réponse et je l'accepterai. –

Répondre

2

donc model.isNew() retours I » d deviner que quelque chose comme ce create override fonctionnerait:

create: function(attributes, options) { 
    options = options || { }; 
    options.came_from_create = true; 
    return Backbone.Collection.prototype.create.call(this, attributes, options); 
} 

Ensuite, vous pouvez chercher came_from_create dans votre rappel:

function onModelAdded(model, collection, options) { 
    if(options && options.came_from_create) { 
     // We started in a create call on the collection. 
    } 
    else { 
     // We came from somewhere else. 
    } 
} 

Vous pouvez généralement utiliser l'argument options Piggy bits de retour de données autour si vous faites attention à ne pas utiliser les noms d'options que Backbone souhaite utiliser .

0

de Backbone Docs

isNew

a ce modèle encore été enregistré sur le serveur? Si le modèle n'a pas encore d'identifiant, il est considéré comme nouveau.

source Backbone:

isNew: function() { 
    return this.id == null; 
}, 

Lorsque le modèle créant pas id établir alors il est un nouveau modèle (modèle sans id considéré comme nouveau), et vrai

function onModelAdded(model, collection, options) { 
    if(model.isNew()){ 
     // It's created 
    }else{ 
     // It's fetched! 
    } 
} 
+0

Malheureusement je ne peux pas compter sur ça, parce que je pourrais avoir '{wait: true}'. –

+0

Une autre idée est de mettre un drapeau (en remplaçant backbone créer méthode) et après enregistrement modèle complet unset le drapeau, 'créer: function (modèle, collection) { ... if (options.wait) { modèle .createdNew = true; model.once ('synchro', function() {} supprimer this.createdNew;} ... } ' ne peut pas tester cette solution, mais espérons que cela fonctionne! –

Questions connexes