Question

J'ai ce code actuellement:

handleSubmit: function(e)
{
    var to_bucket = this.$('.transaction_bucket').val();

    // Move all the transactions for this bucket to the selected bucket
    window.app.model.active_transactions.each(
        function(transaction)
        {
            transaction.set({bucket_id: to_bucket});
            transaction.save();
        }
    );

    this.model.destroy({success: function() { window.app.model.buckets.fetch();}});
}

Comment puis-je modifier cela pour que le détruire seulement déclenche une fois toutes les transactions ajax _.each se produisent? Si j'avais une demande ajax précédente, je voudrais simplement utiliser le succès. Paramètre, mais je ne peux pas le faire ici

Quelle est la bonne façon de le faire dans la structure centrale?

Était-ce utile?

La solution 3

Une solution possible serait de créer une méthode API personnalisée qui a pris les opérations en tant que paramètres et a fait le travail du côté du serveur. Cela réduirait les demandes https et d'augmenter les performances ainsi.

Autres conseils

model.save renvoyer l'objet xhr utilisé dans la demande. Avec jQuery 1.5, ces objets sont objets différé, vous pouvez utiliser pour construire un mécanisme de synchronisation.

Par exemple,

var to_bucket = this.$('.transaction_bucket').val(), 
    calls=[],
    mdestroy=this.model.destroy;

window.app.model.active_transactions.each(function (transaction) {
    transaction.set({bucket_id: to_bucket});
    calls.push(transaction.save());
});

$.when.apply($, calls).then(function () {
    mdestroy({success: function () {window.app.model.buckets.fetch();}});
});

Je n'ai aucune expérience avec colonne vertébrale, mais j'aborder ce problème comme ceci:

  • Retourne le nombre de active_transactions.
  • Sur transaction.save (), vérifier le nombre de transactions traitées (dans le succès et / ou rappel d'erreur), si elle correspond au nombre de active_transactions, puis détruire le modèle.

Il suffit de garder une trace du nombre de transactions traitées et déjà déclencher la destruction dans le dernier rappel comme ceci:

handleSubmit: function(e)
{
  var to_bucket = this.$('.transaction_bucket').val();
  var remainingTransactions = window.app.model.active_transactions.length;
  var self = this;

  window.app.model.active_transactions.each(
    function(transaction)
    {
        transaction.save({bucket_id: to_bucket}, {
          success: function(){
            remainingTransactions -= 1;
            if(remainingTransactions < 1) {
              self.model.destroy({success: function() { window.app.model.buckets.fetch();}});
            }
          }
        });
    }
  );

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top