8
votes

Extjs 4.1 Appelez un contrôleur d'un autre

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();
        },


1 commentaires

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.


5 Réponses :


2
votes

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 .


2 commentaires

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 d'autres contrôleurs et schez-les avec toutes les méthodes 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.



3
votes

Il devrait vraiment être xxx pré>

ou quelque chose le long de ces lignes (afin d'avoir un correct code> référence qui pointe sur le "propriétaire" de la méthode, L'objet du contrôleur) p>

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 code> pour le rappel de réussite, appelez ceci.finishlogin (). P> xxx pré>

aussi, vous pouvez extraire une autre instance de contrôleur à l'aide de Contrôleur # GetController Code>. P>

this.application.mon('logincomplete', this.setupAssignment, this);


2 commentaires

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 . Et toutes les variations de ceci.getController . Ceci.Application échoue car, je crois, d'une portée inappropriée. Puisque je ne comprends pas assez bien JS, je ne peux pas comprendre.



6
votes

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


5 commentaires

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é



0
votes

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


2 commentaires

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



0
votes

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


0 commentaires