Remarque: je suis un ignoramus total concernant JavaScript. em> J'ai cassé mon application EXTJS 4.1 MVC dans plusieurs contrôleurs tels que: P> // 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();
},
5 Réponses :
Il n'y a pas de moyen standard de tirer des événements entre les contrôleurs, mais il est possible avec des hacks personnalisés. Voir ma récente publication du blog . P>
Il est possible: en utilisant ceci.getController ('Controlername'). FOO ();
@Evantrimboli sûr, mais de cette façon lie les contrôleurs trop serrés pour mon goût. Vous devez créer tous i> d'autres contrôleurs et schez-les avec toutes les méthodes i> que vous appelez simplement pour tester celui que vous travaillez en ce moment. Les événements de tir sont beaucoup plus agréables et plus propres.
Il devrait vraiment être ou quelque chose le long de ces lignes (afin d'avoir un Cependant, pourquoi utilisez-vous cette manière peu orthodoxe pour appeler la méthode du contrôleur actuel. Il suffit de définir la lunette aussi, vous pouvez extraire une autre instance de contrôleur à l'aide de correct code> référence qui pointe sur le "propriétaire" de la méthode, L'objet du contrôleur) p>
code> pour le rappel de réussite, appelez ceci.finishlogin (). P>
Contrôleur # GetController Code>. P>
this.application.mon('logincomplete', this.setupAssignment, this);
Vous n'avez pas à appeler cela.Application.getController (), vous pouvez simplement faire cela.getController ().
J'ai été incapable de comprendre comment obtenir la bonne portée de ceci code>. Et toutes les variations de
ceci.getController code>.
Ceci.Application Code> échoue car, je crois, d'une portée inappropriée. Puisque je ne comprends pas assez bien JS, je ne peux pas comprendre.
C'est logique pour moi de déclencher un événement personnalisé de la forme et de l'écouter simplement dans vos contrôleurs, comme ce que vous avez dit ici:
On dirait que je devrais tirer un événement unique écouté par les deux contrôleurs p> blockQuote>
xxx pré> puis dans chacun de vos contrôleurs que vous peut em> écouter avec le contrôleur # contrôle, comme celui-ci: P>
Ext.define('YourApp.controller.Quiz', { extend: 'Ext.app.Controller', init: function() { var me = this; me.control({ '#loginpanel': { loginsuccess: me.someOtherHandler } }); }, someOtherHandler: function(form) { //whatever needs to be done console.log(form); } }
Nous utilisons une approche similaire à celle-ci, mais parce que nous n'aimons pas que certains de nos événements soient liés à une vue spécifique, nous déclenchons nos événements à l'aide de ext.viewport.fireevent ("EventName"). Ensuite, vous pouvez les écouter dans n'importe quel contrôleur à l'aide de la référence Viewport.
@mmigdol, comment testez-vous vos contrôleurs si vous tirez des événements de Viewport?
@ALEXANDERTOKAREV, juste des événements d'incendie de la fenêtre de la fenêtre dans le harnais de test ... ou peut-être que je suis mal compris votre question?
@mmigdol, cela implique que, afin de tester un contrôleur, vous devez instancier la fenêtre et tous ses enfants. Ou utilisez-vous une sorte de fenêtre de test uniquement?
@AlexandertOkarev, c'est vrai. Mes tests d'unité sont normalement des applications autonomes qui instancent une vue unique et / ou son contrôleur associé
J'ai aussi cherché cela et tout ce dont vous avez besoin est ASANDA.App.getController ("Quiz"). SetupAssiXImment ();, où ASANDA est le nom de votre application P>
Pourriez-vous s'il vous plaît élaborer plus votre réponse Ajout d'un peu plus de description sur la solution que vous fournissez?
Ne comprend pas la question. Si vous êtes lu ci-dessus, voici la manière dont vous appelez la fonction de différents contrôleurs. Vous devez spécifier où est le fichier. par exemple
Vous devez utiliser un messageBUS si vous devez envoyer des événements entre contrôleurs:
MsgBus.on('eventName', functionHandler,scope); //scope is not mandatory ... functionHandler:function(eventArg_1,eventArg_2){ ... //do whatever you want ... }
J'irais avec un bus d'événement d'application. C'est ce que Google fait pour GWT. Fondamentalement, écoutez un événement sur l'application. déclencher l'événement sur l'application.