application météore - existe-t-il un moyen de créer des objets observables

StackOverflow https://stackoverflow.com//questions/23000134

  •  20-12-2019
  •  | 
  •  

Question

Dans mon application météore, j'ai le gestionnaire suivant, renvoyant un enregistrement "contributeur":

Template["IntroductionWizard_Step_1"].helpers({
  contributor: function(n) {
    return ContributorCollection.findOne({contributorName: ""});
  }
});

Cet enregistrement est utilisé dans un modèle réactif :

<input type="text" id="name" name="name" class="form-control-element" value="{{contributor.contributorName}}" 

Si je comprends bien, la raison pour laquelle ce modèle suit les modifications apportées à cet enregistrement est qu'il provient d'une source réactive.Ce que je me demandais, c'est s'il serait logique de créer un véritable objet Contributor et de le renvoyer au lieu d'un simple enregistrement.Mais si je devais faire cela, cet objet ne serait pas observé pour détecter des changements, n'est-ce pas ?En d'autres termes, une approche orientée objet plus traditionnelle peut-elle être utilisée avec Meteor, avec des objets de modèle aussi observables et réactifs (liaisons bidirectionnelles) que ces enregistrements de collection ?

Était-ce utile?

La solution

Vous pouvez faire ce que vous voulez – Javascript est basé sur un prototype, il suffit donc d'obtenir le bon prototype et de le modifier.

Pour améliorer le comportement de l'élément de collection, vous devez utiliser transform méthode:

Contributor = function(doc) {
  _.extend(this, doc); // initialize object with contents of doc
  ...
};

Contributors = new Meteor.Collection('contributors', {
  transform: function(doc) {
    return new Contributor(doc);
  },
});

Vous pouvez désormais ajouter des méthodes au prototype du contributeur :

_.extend(Contributor.prototype, {
  someFunction: function() {...},
  otherFunction: function() {...},
  ...
});

Si vous souhaitez adapter les modalités de collecte, c'est encore plus simple :

Contributors._findOne = Contributors.findOne;

Contributors.findOne = function() {
  var contributor = Contributors._findOne.apply(this, arguments);
  if(!contributor) {
    // initialize and save new contributor
    ...
  }
  return contributor;
};

Avec ces techniques, vous pouvez injecter le comportement souhaité à la collection et à ses éléments.

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