2017-06-14 4 views
0

Ich habe folgenden Ablauf: Bevor die App startet, möchte ich etwas auf dem Server überprüfen. Basierend auf der Antwort möchte ich eine Entscheidung treffen. Ich habe eine Dienstprogrammklasse erstellt, die mein js-Ereignis und auch einen App-Controller umschließt.Extjs6 Custom js Ereignis

Bellow ist app-Controller:

Ext.define('MyApp.controller.AppController', { 
    extend: 'Ext.app.Controller', 
    appEventDispatcher:function(){ 
     // Create a dummy DOM element 
     var dummy = document.createTextNode(''); 

     // Create custom wrappers with nicer names 
     this.off = dummy.removeEventListener.bind(dummy); 
     this.on = dummy.addEventListener.bind(dummy); 
     this.trigger = function(eventName, data){ 
      if(!eventName) return; 
      var e = new CustomEvent(eventName, {"detail":data}); 
      dummy.dispatchEvent(e); 
     } 
    } 
}); 

Und meine Utility-Klasse:

Ext.define('MyApp.util.Util', { 

    statics : { 
     checkSomethingOnServer: function(customEvent){ 
      var store = Ext.StoreManager.lookup('appStore'); 
      store.load({ 
       scope: this, 
       callback: function(records, operation, success){ 
        if (success === true){ 
         customEvent.trigger('success', true); 
        if (success === false) 
         debugger; 
         customEvent.trigger('fail', true); 
        } 
       } 
      }); 
     } 

    } 
}); 

die Utility-Klasse ich mit einem Speicher laden. In der Callback-Methode trigger ich mein benutzerdefiniertes Ereignis. Dieses Ereignis wird in der Datei app.js behandelt.

Der Code funktioniert in fiddle und auch mit app watch, wenn ich den Code erstellen möchten, einige Fehler auftreten, beschweren (Syntaxfehler).

Ich habe auch eine fiddle erstellt.

Wie erstellt man ein benutzerdefiniertes Ereignis in ExtJS und wie man es benutzt? Ich brauche das gleiche Verhalten wie beim js-Event, aber Extjs-Implementierung.

Antwort

0

In ExtJS, Sie würden nur einen Event-Listener in den Laden mit Ihrem benutzerdefinierten Ereignisnamen anfügen:

store.on('myownevent', function(success) { 
    console.log(success); 
}); 

und Ihr Code kann mit diesem Namen in dem Laden gehen Sie vor und Feuer Ereignisse:

store.load({ 
    scope: this, 
    callback: function(records, operation, success){ 
     store.fireEvent('myownevent', success); 
    } 
}); 

Wenn kein Listener für dieses Ereignis angehängt ist, passiert nichts; Wenn ein oder mehrere Listener angeschlossen sind, werden sie in der Reihenfolge der Priorität für diejenigen mit derselben Priorität in der Reihenfolge ausgeführt, in der sie hinzugefügt wurden.

https://fiddle.sencha.com/#view/editor&fiddle/21g7

+0

Und wenn ich eine einfache Ext.Ajax Anfrage statt Speicher geladen? Mit Store kann ich zum Beispiel StoreManger verwenden, um einen Verweis darauf zu bekommen, und Hörer anhängen, aber wie macht man das mit Ajax? – florin

+0

Sie können immer ein Ereignis an 'Ext.Ajax' anhängen, da [' Ext.mixin.Observable'] (http://docs.sencha.com/extjs/6.2.1/classic/Ext.mixin.Observable.html) wird in 'Ext.Ajax' gemischt. Allerdings kann ich das nicht empfehlen, da Ext.Ajax ein Singleton ist. Dies scheint jedoch ein [XY-Problem] zu sein (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Was versuchst du zu erreichen? – Alexander

+0

In [this] (https://fiddle.sencha.com/#view/editor&fiddle/21l0) Geige, ändere ich den Code, so dass ich Ajax anstelle von speichern verwenden. Ich habe dem Code einige Kommentare hinzugefügt, um zu beschreiben, was ich tun möchte (dies ist ein Punktproblem). Im großen Bild möchte ich verstehen, wie benutzerdefinierte Ereignisse zu erstellen und wie man sie verwendet – florin