wake-up-neo.com

Wie finde ich ein Modell aus einer Sammlung anhand eines anderen Attributs als der ID?

Ich habe ein Modell mit mehreren Objekten:

//Model
Friend = Backbone.Model.extend({
    //Create a model to hold friend attribute
    name: null,
}); 

//objects
var f1 = new Friend({ name: "Lee" });
var f2 = new Friend({ name: "David"});
var f3 = new Friend({ name: "Lynn"});

außerdem werde ich diese Freunde-Objekte zu einer Sammlung hinzufügen:

//Collection
Friends = Backbone.Collection.extend({
    model: Friend,
});

Friends.add(f1);
Friends.add(f2);
Friends.add(f3);

und jetzt möchte ich ein modell nach dem namen des freundes bekommen. Ich weiß, dass ich ein ID Attribut hinzufügen kann, um dies zu erreichen. Aber ich denke, es sollte einen einfacheren Weg geben, dies zu tun.

47
Anar

Backbone-Sammlungen unterstützen die Methode underscorejs find, daher sollte dies funktionieren.

things.find(function(model) { return model.get('name') === 'Lee'; });
64

Für einfache Suche nach Attributen können Sie Collection#where verwenden:

wobei collection.where(attributes)

Gibt ein Array aller Modelle in einer Auflistung zurück, die den übergebenen Attributen entsprechen. Nützlich für einfache Fälle von filter.

Wenn also friends Ihre Friends Instanz ist, dann:

var lees = friends.where({ name: 'Lee' });

Es gibt auch Collection#findWhere (eine spätere Ergänzung, wie in den Kommentaren vermerkt):

findWhere collection.findWhere(attributes)

Genau wie where, gibt jedoch direkt nur das erste Modell in der Auflistung zurück, das den übergebenen Attributen entspricht.

wenn Sie also erst nach eins sind, können Sie Dinge sagen wie:

var lee = friends.findWhere({ name: 'Lee' });
84
mu is too short

Am einfachsten ist es, die Option "idAttribute" des Backbone-Modells zu verwenden, um Backbone mitzuteilen, dass Sie "name" als Modell-ID verwenden möchten.

 Friend = Backbone.Model.extend({
      //Create a model to hold friend attribute
      name: null,
      idAttribute: 'name'
 });

Jetzt können Sie die Collection.get () -Methode direkt verwenden, um einen Freund anhand seines Namens abzurufen. Auf diese Weise durchläuft Backbone nicht alle Friend-Modelle in der Sammlung, sondern kann ein Modell anhand seines "Namens" direkt abrufen.

var lee = friends.get('Lee');
6
coderC

Sie können findWhere() für Backbone-Sammlungen aufrufen, wodurch genau das Modell zurückgegeben wird, nach dem Sie suchen.

Beispiel:

var lee = friends.findWhere({ name: 'Lee' });
5
Silver Ringvee