2015-07-21 1 views
1

Я хотел бы добавить слушателей в активные элементы, как указано в установочном файле. Установочный файл может быть что-то вроде этого:Ext JS - добавление слушателей во время выполнения

<listeners> 
    <listener> 
     <field>id</field> 
     <match>button-*</match> 
     <using>reg-exp</using> 
     <excludes> 
      <exclude>button-yes</exclude> 
      <exclude>button-no</exclude> 
      <exclude>button-cancel</exclude> 
     </excludes> 
     <event>click</event> 
     <action>onButtonClick</action> 
    </listener> 
    <listener>...</listener> 
</listeners> 

Что означает любой элемент с идентификатором, соответствующим button-*, за исключением button-yes, -no и -cancel, будет вызывать onButtonClick когда click события.

Это не обязательно должно быть встроенное событие, может быть обычным, например fileSystemException, или userTimedOut. Таким образом, событие может быть запущено где-то в коде, и все прослушивающие его элементы будут иметь соответствующие действия.

В идеале хотел бы загрузить файл установки очень рано, прежде чем создавать какие-либо элементы, и иметь возможность добавлять слушателя даже к элементу, созданному во время выполнения. Так, например, новый элемент с ID button-reject, созданный «на лету», который выполняет критерии, получит слушателя. Поэтому я предполагаю, что он должен расширить метод создания низкого уровня?

Что-то вроде этого сделано в ExtJS? Скажите, расширив один или несколько базовых классов?

ответ

2

Если вы можете загрузить этот файл в объект JSON или ExtJS HashMap, вы можете в глобальном масштабе прослушать событие компонента afterrender для проверки вашего объекта HashMap или JSON для соответствия и применения соответствующего прослушивателя.

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

+0

Можете ли вы предложить ссылку о том, как добавить глобального прослушивателя для 'afterrender'? Я попробовал 'Ext.on (« afterrender », function (data) { \t для (ввод данных) \t \t console.log (" *** after-render "+ key +" \ t "+ data [key ]); }); 'перед тем, как приложение определено, но оно не вызывается. – Buddy

+1

Вы можете добавить его в init или конструктор главного контроллера: 'Ext.define ('AM.controller.Users', { init: function() { this.listen ({ ) Компонент: { '*' : { afterrender: this.someMethod }} });} , ... }); ' – cpastore84

+0

Их [документация] (http://docs.sencha.com/extjs/4.2.2/ #!/api/Ext.app.Controller-method-listen) может быть более понятным. – cpastore84