8
votes

Backbone.js - Comment créer une collection possédant des propriétés liées

C'est un exemple grave, mais je crois que cela devient le point de vue.

Permet de dire que j'ai une collection de voitures à colonne vertébrale. Et pour la collection, je veux une propriété appelée Isvalid. Je veux que d'autres objets puissent être liés à Isvalid et à déclencher une fonction lorsque cela change d'ISVALID. La propriété Collection Isvalid sera modifiée en fonction des modèles d'une collection dans son ensemble.

Par exemple, si toutes les portes sont verrouillées sur chaque voiture, les ISVALID devraient changer de vrai. Lorsque des modifications ISVALID, toutes les fonctions liées à l'événement de changement iSValid doivent être tirées.

Ma question est, comment puis-je créer une collection qui contient des propriétés liées qui fonctionne comme des propriétés modèles? < P> C'est le code que je voudrais faire fonctionner. xxx


Mise à jour

Voir ma solution complète comme une réponse ci-dessous.


0 commentaires

3 Réponses :


5
votes

Il n'y a donc pas de moyen «intégré» de répondre aux changements de propriété sur une collection, car il n'y a vraiment pas de manière prise en charge (que je connaisse) d'avoir des propriétés sur une collection. Cependant, c'est toujours totalement possible comme ça, je pense. (non testé, mais devrait être assez proche) xxx

une note: vous ne voulez pas ISVALID: répertorié comme une propriété comme si vous voulez modéliser ou URL. Cela semble faire du colonne vertébrale être bizarre et que votre Isvalid pourrait couvrir toutes les instances de la collection. Il est préférable de les définir comme une initialiseur, alors chaque fois que vous instanciez cette collection, vous aurez dûment une instance d'ISVALID accessible par cela.isvalid.


1 commentaires

Merci d'avoir répondu. Je crois que vous m'avez signalé dans la bonne direction. Appréciez les informations que cela devrait être créé dans l'initialisation. Quand je suis fini avec ma solution de travail, je le posterai.



2
votes

Voici ma solution complète à cette question: jsfiddle Exemple complet

@spotmat m'a mis dans la bonne direction, mais je devais ajouter des fonctionnalités supplémentaires . Voici quelques articles qui devaient être résolus: p>

  • La collection Contructor a besoin de gérer des données à la disposition li>
  • Lorsqu'un modèle isocké de propriétés est mis à jour, la collection doit être ré-validée li> ul>

    Je ne sais pas si l'ajout de propriétés de liaison à une collection est une excellente idée, mais est quelque chose d'amusant de comprendre, et j'ai appris beaucoup. P>

    var logger = new Logger();
    log.bind("log", function(message){
        console.log(message[0]);
    });
    
    var carsData = [
        { "Model": "Chevy Camero", "Year": 1982, "IsLocked": true },
        { "Model": "Ford F-150", "Year": 2011, "IsLocked": false }
    ]
    
    var cars = new Cars(carsData);
    cars.bind("change:isValid", function(isValid){
        log.trigger("log", ["change:isValid: " + isValid]);
    });
    
    cars.add({ "Model": "Toyota Tacoma", "Year": 2006, "IsLocked": true });
    cars.at(1).set({ "IsLocked": true });
    


0 commentaires

5
votes

Vous pouvez utiliser quelque chose comme ceci;

var Cars = Backbone.Collection.extend({
  model: Car,
  url: "Cars",
  initialize: function () {
    this.bindableProperty('isValid', false);
  }
});


3 commentaires

Je vais essayer ceci ce soir.


Merci Stephen Belanger pour vous répondre. La solution que vous fournissez est probablement la plus propre, mais comme vous l'avez mentionnée, elle ne fonctionne pas avec IE8. Même si je devais écrire un peu plus de code pour obtenir mon exemple de travailler avec votre recommandation, je n'ai plus besoin d'appeler manuellement le code suivant, ce qui est très agréable: voitures.trigger ("modifier: isvalid", [ this.isvalid]) Maintenant, chaque fois que la propriété ISVALID est modifiée, l'événement est tiré automatiquement. exemple Jsfiddle


Juste pour quiconque pourrait lire ceci à l'avenir; Il fonctionne dans IE9 + et partiellement dans IE8, comme expliqué ici; développeur.mozilla.org/fr/javaScript/reference/ Global_Objects / ...