Слушатели ExtJs - PullRequest
       23

Слушатели ExtJs

7 голосов
/ 25 июля 2011

Я хочу получить событие onload, работающее с моим объектом конфигурации.

Следующие работы, кроме случаев, когда я создаю

config.listeners={..}

(я думаю, это то, что мне нужно?), Чтобы заменить

this.onload({...});

Я даже использую правильный конфиг? (Я вообще понятия не имею об обработке событий)

Ext.define('data.SimpleStore', {
extend: 'Ext.data.Store'
,constructor: function (config) {

    config.url=config.url||"afsud"; //If no call, we assume that url has been passed. Pass neither and be shot
    config.id=config.url+'Store';//call should be unique, else its another set of headaches. 
    //console.log(config);
    Ext.define(config.id+'M', { //for a painful reason, you cant have a store without a model
        extend: 'Ext.data.Model',
        fields: []//we figure these out anyways
    });
    config.root=config.root||'data';
    config.type=config.type||'json';
    config.proxy= config.proxy||{ //note if we override our proxy, then server.php might not work as black magic
        type: 'ajax'
        ,url : config.url
        ,reader: {
             type: config.type//seriously if you want to change this, go away
            ,root: config.root//we assume. 
        }
    };
    config.model=config.id+'M';//model should match store anyway. Generic models are out of scope atm
    config.listeners={
        //this.populateFields //Error'd
    };
    this.callParent([config]);
    this.load({//This works, but its after the parent call, so not exactly what i want
        callback: function(records,operation,success){
            var obj=Ext.decode(operation.response.responseText);     
            this.add(obj[config.root]);
            console.log(this.getRange());
            console.log(config);
        }
    });
}
,populateFields:function(){
    console.log('ran'); // never happens
}
});

var s=   Ext.create('data.Store',{url:'test.php'});
s.load();

Ответы [ 4 ]

20 голосов
/ 25 июля 2011

В ExtJS события управляются двумя способами:

Во-первых, вы можете добавить в свою конфигурацию listeners объект:

var s = Ext.create('data.SimpleStore',{
  url:'test.php',
  listeners: {
    'load': function(store, records, successful,operation, options) {
      //Here you are handling onload event
    }
  } //Don't forget to close all code blocks
});
s.load();

Во-вторых, выможно использовать on метод:

var s = Ext.create('data.SimpleStore',{url:'test.php'});
s.on('load', function(store, records, successful,operation, options) {
  //Here you are handling onload event
});
s.load();
4 голосов
/ 25 июля 2011

Добавить к первому ответу Molecule, который я часто использую в своих корпоративных приложениях, потому что он более лаконичен и легче для чтения.

Часто проще использовать шину для передачи сообщений по вашему приложению.

myApp.Bus = new Ext.util.Observable();
myApp.Bus.addEvents(
    'myCustomEvent'
);

Тогда в вашем приложении используйте следующую команду для стрельбы по шине:

myApp.Bus.fireEvent( 'myCustomEvent', {someData: value} );

А где вы хотите послушать событие:

... // config
myObj.on('myCustomEvent', function(someData) { doSomething(); }, this);
3 голосов
/ 25 июля 2011

Несколько вещей, прежде чем вводить мой способ кодирования:

  1. Обычно я не назначаю id Ext Objects, так как это плохая практика. Нам нужны id с в очень редких случаях, и если нет абсолютно никакого способа получить доступ к объекту без использования id (я не могу придумать причину).
  2. Вы ошибаетесь по поводу "У вас не может быть магазина без модели". Использование Model - хорошая практика, но вы всегда можете определить один Store без модели, и это поможет вам создать его автоматически.
  3. Если у вас есть значения по умолчанию, было бы хорошо поместить их в свойства класса.
  4. Больше похоже на консистенции, мы заканчиваем строку запятой, а не начинаем с запятой.

Итак, чтобы немного очистить ваш код, я предложил этот фрагмент кода ( демонстрация этого кода ):

/**
 * First, you might need to describe what is your class about.
 * 
 * So this is the SimpleStore of my App bla bla..
 * 
 * Also take note that "data" is a bit too generic to be a Namespace. Try
 * something else. Namespace always defined in CamelCase.
 */
Ext.define('MyApp.data.SimpleStore', {

    extend: 'Ext.data.Store',

    /**
     * We often define those 'default' variables in this section.
     * One thing is to make it more 'ext' like.
     */

    /**
     * @cfg {string} url
     * Description...
     */
    url: 'afsud',

    /**
     * @cfg {string} root
     * Description..
     */
    root: 'data',

    /**
     * @cfg {string} type
     * Description...
     */
    type: 'json',

    /**
     * @cfg {boolean} autoLoad
     * We make autoload = true here, so we can
     * always have the store loaded on initialization
     */
    autoLoad: true,

    /**
     * Creates the Store
     * @param {Object} cfg
     */
    constructor: function(cfg) {

        //Since ExtJS4, we often use variable 'me' to refer 'this'.

        //Thou in this case we didn't use much of 'me', but it's much
        //cleaner than 'this' yeh?
        var me = this;

        //Simply override everything here, no special logic required.
        Ext.apply(me, cfg || {});

        me.proxy = {
            type: 'ajax',
            url: me.url,
            reader: {
                type: me.type,
                root: me.root
            }
        };

        me.callParent(arguments);

        //Then we add our events
        /**
         * In ExtJS, we always add events after a constructor has been called,
         * or after initComponent has been called. We then add the events by using
         * this method.
         * 
         * The .on method is defined in Ext.util.Observable. Observable is a class
         * inherited by almost everything in ExtJS. It's also a nice class
         * to base from if you write your own stuff which supports Event Management.
         * 
         * .on is the shorthand for addListener, and .un is its opposite.
         * 
         * We add an handler to the load event, with the handler defined as me.onLoad,
         * and scoped to this object.
         */
        me.on('load', me.onStoreLoad, me);

        me.on('beforeload', me.onBeforeLoad, me);
    },

    /**
     * This is optinal, purely just to show you the code is running
     */
    onBeforeLoad: function(st) {
        alert('Store is trying to retrieve data from '+st.url);
    },

    /**
     * Handling the load event..
     * 
     * @param {Ext.data.Store} st The store
     * @param {Array} records An array of records
     */
    onStoreLoad: function(st, records) {
        if (!records) alert('And it seems like we cannot reach '+st.url);
    }
});

//Then later in your code, you call your store.
//Remember that we set autoLoad:true, so you don't need to call
//s.load() again.
var s = Ext.create('MyApp.data.SimpleStore', {
    url: 'test.php'
});

Обработка событий в ExtJS очень хорошо определена и структурирована. Вы всегда можете посетить эту страницу , чтобы узнать больше об обработке событий.

Если вы не знаете, как кодировать ExtJS, вы всегда можете посмотреть на их исходный код и поучиться у экспертов.

Дополнительные примечания

this.load(.., который вы упомянули в своем коде, на самом деле является методом, определенным в Ext.data.Store, который просит Store выполнить действие load, и в случае успеха Store загрузит callback что вы указали. Я думаю, что это не load событие, о котором вы упомянули.

Удачи и ура!

0 голосов
/ 14 января 2014

Обязательно прикрепляйте события после визуализации компонентов. Мое решение перевешивает initEvents() функцию компонентов

Ext.define('MyApp.grid.MyGrid', {
  extend: 'Ext.grid.Panel',
  initEvents: function() {
    // attach events here
    this.callParent(arguments)
  }
});
...