Si je suive un motif MVC rugueux dans JavaScript, quelle est la meilleure façon pour la vue (telle qu'un bouton code> code>) pour notifier au contrôleur? p>
Si la touche Merci pour toute entrée! P> CODE> FIRE Un événement que le contrôleur doit écouter? Ou, si la touche
code> appelle directement une fonction de contrôleur? Ou peut-être que le contrôleur doit affecter l'événement à la vue? P>
3 Réponses :
question intéressante. Je pense que cela dépendrait beaucoup de choses sur votre situation, la complexité de votre exemple et les modèles JavaScript particuliers que vous utilisez.
Si le bouton dont vous parlez est simplement un élément HTML, cela pourrait être un manière simple: p> ou, si votre code> est un objet ou un module que vous avez créé, vous pouvez définir un rappel: P >
var Button = function(selector, clickFunction) {
// Using jquery
$(selector).click(clickFunction)
...
}
var MyController = function() {
this.particularMethod = function() {
// update model
}
var button = new Button("#myButton", this.particularMethod);
...
}
Je dirais que la vue Permettez-moi d'expliquer : P> @Raynos a écrit: P> Les contrôleurs écoutent l'entrée. Cela signifie que les contrôleurs écoutent des événements
des nœuds DOM p>
blockquote> Personnellement, même si je suis d'accord avec la première déclaration, je n'aime pas l'interprétation. p> Pour suivre cet état signifie que le contrôleur doit connaître chaque bouton / élément de texte / élément dans l'interface utilisateur et son identifiant / sélecteur. p> Je préfère avoir les événements sémantiques d'incendie d'affichages tels que "LanguesEnlevés" ou "chercheurRequeste" et ajouter les données pertinentes à l'événement. P> Donc, donc un flux typique serait que la vue Render quelques interface utilisateur (disons qu'il a une boîte de recherche et un bouton), lorsque l'utilisateur clique sur le bouton - la vue Si vous maintenant. Choisissez de modifier la conception de votre application pour afficher les liens de termes de recherche au lieu d'une zone de recherche et d'un bouton (ou même si vous avez la côte à côte - ou sur différents écrans), la seule chose que vous devez changer est la vue une lettre secondaire technique forte>:
Si vous utilisez JQuery et en supposant que votre vue est un objet JavaScript, vous pouvez utiliser p> pour déclencher l'événement p> et p> Écouter et gérer l'événement. P> p>
IMO, c'est certainement un moyen bien meilleur de le faire. Le contrôleur ne devrait pas écouter des objets tels que le bouton cliqué, il devrait être d'écouter des événements sémantiques / fonctionnalités demandées. La manière dont cette fonctionnalité est initiée par l'utilisateur final peut être différente entre deux vues différentes (les personnes oublient souvent que l'un des points principaux de MVC est la possibilité d'avoir plusieurs vues sans avoir à modifier le modèle ou le contrôleur).
Il y a beaucoup de façons de le faire. Voici aller simple.
var app = new App(); function App() { var model = new Model(); var view = new View(); var controller = new Controller(view, model); } function Controller(view, model) { view.addActionListener(function() { alert("on activate"); }); } function View() { var self = this; $("button").onclick = function() { self.listener(); } } View.prototype.addActionListener = function(listener) { this.listener = listener; }
Les contrôleurs écoutent l'entrée. Cela signifie que les contrôleurs écoutent des événements à partir de nœuds DOM.
@Raynos: Voulez-vous dire que la vue attribue l'élément DOM à ONCLICK, et à l'intérieur de celui-ci, il incendie un événement que le contrôleur doit s'abonner? Merci!
Non, la vue n'a aucune entreprise qui parle au contrôleur. Le contrôleur obtient une poignée sur le nœud DOM et attache le gestionnaire lui-même.
@Raynos génial! Merci pour l'explication. Si vous avez posté ceci comme réponse, je l'accepterais.