【问题标题】:Extjs6 Custom js eventExtjs6 自定义js事件
【发布时间】:2017-06-14 22:10:55
【问题描述】:

我有以下流程:在应用程序启动之前,我想检查服务器上的某些内容。根据回复,我想做出决定。我创建了一个实用程序类来包装我的 js 事件以及一个应用程序控制器。

下面是应用控制器:

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

还有我的实用类:

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

    }
});

使用实用程序类我加载了一个商店。在回调方法中,我触发了我的自定义事件。此事件在 app.js 文件中处理。

代码在小提琴中工作,也使用应用程序手表,当我想构建代码时,出现一些错误抱怨(语法错误)。

我还创建了一个fiddle

如何在 ExtJS 中创建自定义事件以及如何使用它?我需要与 js 事件相同的行为,但需要 Extjs 实现。

【问题讨论】:

    标签: extjs extjs6 extjs6-classic


    【解决方案1】:

    在 ExtJS 中,您只需使用自定义事件的名称将事件侦听器附加到商店:

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

    您的代码可能会继续并以该名称在商店中触发事件:

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

    如果没有附加该事件的侦听器,则不会发生任何事情;如果附加了一个或多个侦听器,它们将按优先级顺序执行,对于具有相同优先级的侦听器,按添加顺序执行。

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

    【讨论】:

    • 如果我有一个简单的 Ext.Ajax 请求而不是存储加载?使用商店,我可以使用例如 StoreManger 来获取对它的引用,并附加侦听器,但是如何使用 ajax 来做到这一点?
    • 您始终可以将事件附加到Ext.Ajax,因为Ext.mixin.Observable 混合到Ext.Ajax 中。但是,我不建议这样做,因为 Ext.Ajax 是一个单例。但是,这似乎是XY problem。你想达到什么目的?
    • this fiddle 中,我更改了代码,以便使用 ajax 而不是 store。我在代码中添加了一些 cmets 来描述我想要做什么(这是一个更重要的问题)。在大局中,我想了解如何创建自定义事件以及如何使用它们
    • this 是我想要的。您之前的评论帮助我寻找正确的方向。
    • 很高兴您找到了您搜索的内容,但是,这看起来不像是好的代码。在 ExtJS 中,您应该将事件绑定到需要抛出事件的东西上。例如。如果对商店进行了排序,则商店将引发 onsort 事件。如果某个表单域启动了一个 Ajax 请求,那么该表单域应该抛出该事件。等等。这就是我所说的“XY 问题”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多