将函数添加到单个ExtJS侦听器

时间:2017-03-10 13:32:50

标签: javascript extjs

我试图在同一个侦听器中添加两个函数,以便能够组合两个组合的值,禁用两个字段,并根据它选择的值启用它们。这是我创建的听众:

listeners: {
            render: function() {
                var pago = this;
                    pago.onChangeCuentasFn();
                    pago.onChangeFormaPagoFn();
            }
}

这些是Listener调用的函数:

onChangeFormaPagoFn: function(combo, record, index) {
    var iban = Ext.getCmp('clieIban');
    iban.clearInvalid();
    if (record.data.codigo == 4) {
        iban.setDisabled(false);
    } else {
        iban.setDisabled(true);
    }
},

onChangeCuentasFn: function(combo, record, index) {
    var cuenta = Ext.getCmp('clieCuentas');
    cuenta.clearInvalid();
    if (record.data.codigo == 3) {
        cuenta.setDisabled(false);
    } else {
        cuenta.setDisabled(true);
    }
},

我是否必须添加addListener或在侦听器中使用函数?

谢谢!

1 个答案:

答案 0 :(得分:1)

Observable方法addListener它在行为上是累积的。这意味着如果一个人调用它,那么第二个处理程序将按时间顺序执行。 如果 instance.addListener(eventName, handler1, scope1)  和 instance.addListener(eventName, handler2, scope2)eventName被解雇时 执行handler1然后执行handler2(如果handler1没有故意停止事件传播或返回false)。

但是在配置区域中声明侦听器将不允许您两次调用addListener。在那里你可以像你一样使用隐式调用但保留范围和参数(你没有),或者将处理程序与Ext.Function实用程序Ext.Function.createSequence结合起来。

var sayHi = function(name){
 alert('Hi, ' + name);
};

sayHi('Fred'); // alerts "Hi, Fred"

var sayGoodbye = Ext.Function.createSequence(sayHi, function(name){
                                                       alert('Bye, ' + name);
                });

sayGoodbye('Fred'); // both alerts show

使用范围和参数进行隐式调用:

listeners: {
        render: function() {
            var me = this;

            if( me.onChangeCuentasFn.apply(me, arguments)!== false ) { // give first hanlder a chance to stop execution if false is returned
              me.onChangeFormaPagoFn.apply(me, arguments);
           }
        }
}

优雅的方式:

initComponent: function () {
  var me = this,
      combindHanlerFn = Ext.Function.createSequence(me.onChangeCuentasFn,me.onChangeFormaPagoFn, me);



  Ext.apply(me, {
    listeners: {
        render:combindHanlerFn 
     }
  });

  return me.callParent(arguments);
);