ExtJS 4.1 Appel D'Un Contrôleur À Partir D'Un Autre
Remarque: je suis un total ignorant concernant javascript.
J'ai cassé mon ExtJS 4.1 MVC application dans plusieurs régulateurs comme:
/app/controller/Auth
| |Quiz
| |Result
| |Blah...
|model/...
Je tiens à répondre à un "événement", pas un d'Événements DOM, plutôt un Ext.form.action.Submit.success
de l'événement par l'appel de fonctions dans les deux mon Auth
et Quiz
contrôleurs. Un résumé du code de la première partie est ici:
//File: app/controller/Auth.js
attemptLogin : function() {
var form = Ext.ComponentQuery.query('#loginpanel')[0].form;
if (form.isValid()) {
form.submit({
success : function(form, action) {
//THIS IS THE FUNCTION FROM THE CURRENT CONTROLLER
Assessor.controller.Auth.prototype.finishLogin();
//THIS IS THE FUNCTION FROM THE OTHER CONTROLLER
Assessor.controller.Quiz.prototype.setupAssessment();
},
Cela fonctionne, mais se sent mal. Est-il une bonne façon de le faire? Il me semble que je devrais tirer un événement unique qui est écouté par les deux contrôleurs, mais je ne peux pas comprendre comment le faire avec Ext.Event
. De toute orientation?
Merci! Je suis vraiment reconnaissant pour toutes les grandes idées et des conseils.
OriginalL'auteur justinzane | 2012-08-22
Vous devez vous connecter pour publier un commentaire.
Il fait sens pour moi pour déclencher un événement personnalisé à partir de la forme et de simplement l'écouter dans vos contrôleurs, à l'instar de ce que vous avez dit ici:
Puis dans chacun de vos contrôleurs de vous peut l'écouter avec le Contrôleur n ° de contrôle, comme ceci:
Puis ajouter la même chose à votre
Quiz
contrôleur:J'ai utilisé cette méthode avec succès en 4.1.0 et 4.1.1
comment faites-vous des tests unitaires de vos contrôleurs si vous déclencher des événements à partir de la Fenêtre d'affichage?
juste déclencher des événements à partir de la Fenêtre d'affichage dans le harnais de test...ou peut-être que je ne suis malentendu votre question?
Cela implique que dans le but de tester un Contrôleur, vous devez instancier la Fenêtre d'affichage et de tous ses enfants. Ou utilisez-vous une sorte de test seule Fenêtre d'affichage?
c'est le droit. Mes tests unitaires sont normalement applications autonomes qui instancient une vue unique et/ou de son contrôleur
OriginalL'auteur Geronimo
Il devrait vraiment être
ou quelque chose le long de ces lignes (dans l'ordre d'avoir une bonne
this
de référence qui pointe vers le "propriétaire" de la méthode, l'objet de contrôleur)Cependant, pourquoi utilisez-vous ce peu orthodoxe d'appeler l'actuelle méthode du contrôleur. Il suffit de régler le
scope
pour la réussite de rappel, puis appeler cette.finishLogin().Aussi, vous pouvez récupérer une autre instance du contrôleur à l'aide de
Controller#getController
.Ensuite, si votre contrôleur de méthodes ne sont pas en fonction les uns des autres, vous pouvez les faire à la fois écouter le même événement.
Une autre solution consiste à déclencher un événement personnalisé une fois que la connexion est terminée. Vous pourriez le faire sur l'objet application
et dans votre contrôleur de la méthode init:
Veuillez noter que vous ne pouvez pas écouter ces événements par l'intermédiaire de
Controller#control
- voir Alexander Tokarev blog d'un patch à la Poste pour y parvenir.thx. J'ai modifié la section correspondante.
J'ai été incapable de comprendre comment obtenir la bonne portée pour
this
. Et, toutes les variations dethis.getController
.this.application
l'échec car, je crois, d'une mauvaise portée. Depuis je ne comprends pas JS assez bien, je ne peux pas la comprendre.OriginalL'auteur mistaecko
Il n'existe pas de méthode standard pour déclencher des événements entre les contrôleurs, mais il est possible, avec quelques modifications personnalisées. Voir mon récent post de blog.
Bien sûr, mais de cette façon, se lie contrôleurs trop serré à mon goût. Vous devez créer tous d'autres contrôleurs et le talon avec tous méthodes de vous appeler juste pour tester la sur lequel vous travaillez actuellement. De déclencher des événements est beaucoup plus agréable et plus propre.
Peu importe, "il n'y a pas de manière standard" est incorrecte.
Je concède et corrige la position des mains. Voir mise à jour de réponse.
OriginalL'auteur Alex Tokarev
J'ai également été à la recherche de ce et tout que vous avez besoin est Asanda.app.getController ("test").setupAssignment();, où Asanda est le nom de votre application
Ne pas comprendre la question. Si lire ci-dessus, c'est comment vous appelez la fonction de contrôleur différent. Vous devez spécifier où se trouve le fichier. par exemple
OriginalL'auteur Asanda Lamba
Vous devez utiliser un MessageBus si vous devez envoyer des événements entre les contrôleurs:
magasin le bus de message in a global var
Où vous devez envoyer des événements:
Où vous devez recevoir des événements:
OriginalL'auteur Mattex83