2016-07-30 16 views
0

einen Wörterbuch vom Typ habe {name: value}Holt eine Backbone-Sammlung nur mit den Modellen mit bestimmtem Wert

A = { 
    name: x, 
    name: y, 
    name: z 
} 

ich eine Sammlung holen will (bestehend aus Modellen eines ihrer Eigenschaft als ‚Name‘ haben), aber um optimal zu sein möchte ich so abholen, dass der Wert des Attributs 'name' in meinem Wörterbuch existiert.

Gibt es eine Möglichkeit, spezifische Filter wie diese zu tun?

+0

Konnten Sie Ihre Versuche bekannt geben? –

+0

Möchten Sie eine Sammlung filtern oder möchten Sie sie holen (zB von einem Server)? –

+0

@JeppeStougaard Ich möchte die Sammlung teilweise abrufen, anstatt sie (vollständig) zuerst abzurufen und dann die Modelle zu filtern, die meinem Wörterbuch entsprechen. – adelphia

Antwort

0

Nach Untersuchungen und Studien, hier sind die zwei Möglichkeiten, die dies gelöst werden kann: 1. Clientseitige Filterung nach dem Abrufen der Sammlung vom Server. Dies ist eine weniger optimale Methode, besonders wenn die Sammlung riesig ist. In Situationen, in denen Sie wirklich 5 Modelle aus einer 1000er Modellkollektion möchten, kann es ein Overkill sein. Aber wenn die Server-Seite keine Logik zu akzeptieren und mit Hilfe der Filter Client-Filterung hat, soll wie etwas aussehen:

Überlastung der Sammelfilter Code so etwas wie:

var filter = { 
    filter: function() { 
     var results = _.filter(this.models, function(model) { 
      // Perform the check on this model, like compare it to your local dict 
      if (checkPassed) { 
       return true; 
      } 
      return false; 
     }); 
     results = _.map(results, function(model) { 
           return model.toJSON(); 
         }); 
     // Reset the existing collection to filtered models 
     this.reset(results) ; 
}; 
var ExtendedCollection = OriginalCollection.extend(filter); 
  1. Übergeben Sie eine Filteroption im Abruf-Ajax-Aufruf an den Server, und der Server sollte den Filter verstehen und die darauf basierende Sammlung zurückgeben.
4

Wenn Sie die Filterung Client-Seite tun, ist das Überschreiben der Filtermethode wirklich nicht der Weg zu gehen.
Jetzt haben Sie es nicht mehr verfügbar, sollten Sie es später brauchen. Auch das Ändern der Sammlung selbst innerhalb der Filtermethode ist ein unerwünschter Nebeneffekt.

Stattdessen sollten Sie die parse method verwenden, die beim Abrufen der Sammlung automatisch aufgerufen wird.

Jetzt, wie ich es verstehe, möchten Sie die abgerufene Gruppe auf Modelle mit Namen beschränken, die mit den Schlüsseln in Ihrem Wörterbuch übereinstimmen.

Wenn ja, würde ich folgendes tun:

parse: function(response, options) { 
    // Do we want to filter the response? 
    if (options.filterNames) { 
     // Filter 
     response = _.filter(response, function(obj) { 
      // Check if this model name is one of the allowed names 
      return _.contains(options.filterNames, obj.name); 
     }); 
    } 

    // Backbone will use the return value to create the collection 
    return response; 
} 

Und dann holen rufen mit

someCollection.fetch({filterNames: _.keys(someDictionary)}); 

Wenn Sie sicher sind, werden Sie immer die auf Abruf Sammlung Filterung werden, können Sie Lassen Sie die Option weg und verwenden Sie einfach das Wörterbuch innerhalb von Parse.

Alternativ können Sie auch eine fetchFiltered()-Methode für die Sammlung erstellen, die dann die obige Zeile aufruft.