2013-02-19 3 views
1

Mates, j'ai une collection d'invités. Chaque invité a un inDate, un outDate et les id_beds pour le lit qui occupe. Je suis en train de filtrer tous les invités remplissent les déclarations suivantes en même temps:Filtrage collection de backbone avec plusieurs attributs

  • id_beds == lit
  • outdate < date ==
  • Indate> == Date

    App.Collections.Guests = Backbone.Collection.extend({ 
    url: 'guests/', 
    model: App.Models.Guest, 
    getBooking: function(bed, date){ 
    var gf = _.filter(this.models, function(model){ 
        // Get all Guests with id_beds = bed 
         // && outDate < date && inDate <= date 
    }); 
    
    console.log(gf); 
    return gf; 
    } 
    }); 
    

Maintenant, le fait est que je ne sais pas comment filtrer la collection avec ces 3 instructions. Tout d'abord, je ne sais pas comment comparer les dates, car ce sont des chaînes et ne peuvent pas voir qui est plus grand que l'autre. Et d'autre part, je ne sais pas comment serait la logique de filtrer avec plus d'un paramètre.

Des idées?

Merci!

+0

Quel format de chaîne avez-vous choisi? – mtth

+0

J'utilise ce format: AAAA-MM-JJ – Pablo

Répondre

5

Vous y êtes presque. Étant donné que vos dates sont YYYY-MM-DD simples travaux de comparaison de chaînes et votre fonction de filtre devraient simplement true lorsque les trois conditions sont réunies:

getBooking: function(bed, date) { 
    var gf = this.models.filter(function(model) { 
    return (
     model.get('outDate') > date && 
     model.get('inDate') <= date && 
     model.get('id_beds') === bed 
    ) 
    }) 
    // ... 
    return gf 
} 
1

Salut est solution simple ici pour la collecte de filtrage à l'aide du squelette

d'abord dans votre collection vous devrait avoir une fonction filtrée comme

App.Collections.Guests = Backbone.Collection.extend ({ 
    filtered : function () { 

Je suggère d'utiliser le filtre underScore qui retournera vrai pour valide et faux pour invalides où est vrai ce que vous cherchez pour. utiliser this.models pour obtenir les modèles de collecte actuels utilisent Model.get (« ») pour obtenir l'élément que vous voulez vérifier

var results = _.filter(this.models, function (model) {   
     if (model.get('id_beds') == bed 
      && model.get('outDate') < date 
      && model.get('inDate ') < date) 
     return true ; 
     return false ; 
    }); 

Utilisez ensuite vos résultats Souligner la carte et le transformer en JSON comme

results = _.map(results, function(model) { return model.toJSON() }); 

Enfin le retour d'une nouvelle collection de colonne vertébrale avec des résultats que

return new Backbone.Collection(results) ; 

option si vous ne souhaitez pas conserver toutes les données de la collection, mais juste le filterd un vous devez réinitialiser le collecte et ignorer le retour ci-dessus comme

this.reset(results) ;   
Questions connexes