10
votes

JavaScript MVC: Comment les vues avertiront-elles le contrôleur

Si je suive un motif MVC rugueux dans JavaScript, quelle est la meilleure façon pour la vue (telle qu'un bouton ) pour notifier au contrôleur?

Si la touche FIRE Un événement que le contrôleur doit écouter? Ou, si la touche appelle directement une fonction de contrôleur? Ou peut-être que le contrôleur doit affecter l'événement à la vue?

Merci pour toute entrée!


4 commentaires

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.


3 Réponses :


2
votes

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> xxx pré>

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);
    ...
}


0 commentaires

13
votes

Je dirais que la vue devrait attraper l'événement tiré par le bouton et tirer son propre événement qui sera traité par le contrôleur .

Permettez-moi d'expliquer :

@Raynos a écrit:

Les contrôleurs écoutent l'entrée. Cela signifie que les contrôleurs écoutent des événements des nœuds DOM

Personnellement, même si je suis d'accord avec la première déclaration, je n'aime pas l'interprétation.

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.

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.

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 gère l'événement et incendie son propre événement "chercheurRequeste". Cet événement est traité par le contrôleur qui appellerait le modèle lui demandant d'exécuter la recherche. Une fois terminé, le modèle tire un "SearchResultsUnupdatedated" EvNet qui sera traité par la vue , ce qui lui faisait montrer les résultats.

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 : Si vous utilisez JQuery et en supposant que votre vue est un objet JavaScript, vous pouvez utiliser xxx

pour déclencher l'événement

et xxx < / Pré>

Écouter et gérer l'événement.


1 commentaires

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).



1
votes

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;
}


0 commentaires