2017-10-10 2 views
5

다른 버튼에 대해 양식 요소를 개별적으로 바인딩해야합니다. 바인딩 조건을 보내기 위해 요소에서 allowBlank를 사용하고 버튼을 바인딩하기 위해 버튼에서 formBind를 사용합니다. 가장 간단한 방법으로 이렇게해야합니다. (의 ExtJS 4.2.1 클래식)ExtJs는 다른 바인딩을위한 다중 버튼을 형성합니다

Ext.create('Ext.form.Panel', { 
...... 
items: [ 
    Ext.create('Ext.form.field.Date', { 
    ....., 
    allowBlank: false, //bind for both search & download button. 
    ..... 
    }), 
    ......, //// All rest elements bind for both search & download button. 
    Ext.create('Ext.form.ComboBox', { 
    ......, 
    allowBlank: false, //bind for only download button. 
    ...... 
    }) 
], 
buttons: [ 
    { 
    text: 'Search', 
    formBind: true, /// Need to bind for specific field only. 
    }, 
    { 
    text: 'Download', 
    formBind: true, /// Need to bind for all. 
    }, 
    ............ 
}); 

다른 데이터 나 세부 사항은 다음 주저하지 말아 주시기 바랍니다 필요한 경우.

+1

: 여기

는 작업 바이올린입니까? – scebotari66

+2

특정 필드에 대한 변경 핸들러를 작성하고 수동으로 비활성 상태를 제어하십시오. –

+0

답변으로 모든 예제 또는 세부 정보를 제공 할 수 있습니까? –

답변

1

, 당신은 이것에 대한 플러그인을 작성 할 수 있습니다.

Ext.define('App.plugin.MultiDisableBind', { 
    extend: 'Ext.AbstractPlugin', 
    alias: 'plugin.multidisablebind', 

    /** 
    * @cfg 
    * Reference to the fields that this button depends on. 
    * Can contain either direct references, or a query selectors that will be 
    * executed with the button as the root 
    */ 
    depFields: null, 

    /** 
    * @property 
    * A map object with field ids as key, and field values as value 
    */ 
    valuesMap: null, 

    init: function (cmp) { 
     this.setCmp(cmp); 

     cmp.on('render', this.setup, this); 
    }, 

    setup: function() { 
     var cmp = this.getCmp(), 
      depFields = this.depFields, 
      valuesMap = {}; 

     if (!Ext.isArray(depFields)) { 
      depFields = [depFields]; 
     } 

     Ext.Array.forEach(depFields, function (field) { 
      if (Ext.isString(field)) { 
       field = cmp.query(field)[0]; 
      } 

      cmp.mon(
       field, 
       'change', 
       Ext.Function.createThrottled(this.updateValuesMap, 300, this), 
       this 
      ); 
      valuesMap[field.getId()] = field.getValue(); 
     }, this); 

     this.valuesMap = valuesMap; 
     this.updateCmpDisabled(); 
    }, 

    updateValuesMap: function (depField, newValue) { 
     this.valuesMap[depField.getId()] = newValue; 
     this.updateCmpDisabled(); 
    }, 

    updateCmpDisabled: function() { 
     var cmp = this.getCmp(), 
      toDisable = true; 

     Ext.Object.each(this.valuesMap, function (fieldId, fieldValue) { 
      if (!Ext.isEmpty(fieldValue)) { 
       toDisable = false; 
       return false 
      } 
     }); 

     cmp.setDisabled(toDisable); 
    } 
}); 

당신은 다음처럼 버튼이 플러그인을 사용할 수 있습니다 : 내가 함께 하나 넣었습니다

xtype: 'button', 
text: 'My button', 
plugins: { 
    ptype: 'multidisablebind', 
    depFields: ['^form #fieldQuery', fieldVar] 
} 

depFields 설정에서 당신은 버튼의 비활성화 상태에 따라 필드에 대한 참조를 지정하고, 플러그 인은 이러한 필드를 모니터링하므로 각 필드 값이 변경되면 비활성화 된 상태가 업데이트됩니다. 당신이 사용하는 ExtJS에 어떤 버전의 https://fiddle.sencha.com/#view/editor&fiddle/28cm

+0

감사합니다. 그게 내가 원하는 전부 야. –

+0

상자를 벗어난 몇 줄이 똑같은 것을 달성 할 때 사용자 정의 플러그인이 "가장 간단한 방법"이라고 생각하는 방식을 아직도 이해하지 못합니다. – tommyO

+0

@TommyO는 그가 수십 개의 필드를 가지고 있다고 상상합니다. 모든 필드에 변경 리스너를 설정하면 유지 보수하기가 더 까다로운 반복적 인 코드 라인이 생길 수 있습니다. 또한 필드에서보다 단추에 대해이 바인딩 동작을 지정하는 것이 더 적절하다고 생각합니다. 필드는 버튼에 관심이 없어야하며, 버튼은 필드에 관심이 있습니다.플러그인 솔루션은 버튼이 삭제 될 때 더 적합합니다. 모든 것이 정리되고 솔루션에서 버튼을 사용할 수 있는지 여부를 확인해야합니다. – scebotari66

0

나는 fiddle을 생성했습니다. 이 코드는 두 개의 서로 다른 버튼에 각각 bindformBind을 사용합니다. 이런 식으로하고 싶습니까?

+0

표시된 버전으로 시도하십시오. –

+0

죄송합니다 .. 버전 –

3

나는 당신이하려는 일을 성취해야한다고 여기에서 바이올린을 만들었습니다. 아이디어는 대신 Download 버튼의 formBind 설정의, 콤보 상자에 이벤트 리스너를 사용하는 이런 일을하기위한 표준 빠른 방법은 없습니다 https://fiddle.sencha.com/#view/editor&fiddle/289a

Ext.create('Ext.form.Panel', { 
    renderTo: Ext.getBody(), 
    itemId: 'exampleForm', 
    items: [Ext.create('Ext.form.field.Date', { 
      allowBlank: false, //bind for both search & download button. 
     }), 
     Ext.create('Ext.form.ComboBox', { 
      allowBlank: false, //bind for only download button. 
      listeners: { 
       change: function (thisCombo, newValue, oldValue, eOpts) { 
        if (Ext.isEmpty(newValue)) { 
         thisCombo.up('#exampleForm').down('#btnDownload').setDisabled(true); 
        } else { 
         thisCombo.up('#exampleForm').down('#btnDownload').setDisabled(false); 
        } 
       } 
      }, 
      store: ['item1', 'item2'] 
     }) 
    ], 
    buttons: [{ 
     text: 'Search', 
     formBind: true, /// Need to bind for specific field only. 
    }, { 
     itemId: 'btnDownload', 
     text: 'Download', 
     disabled: true 
      //formBind: true, /// Need to bind for all. 
    }] 
}); 
+0

을 보지 못했지만 v4.2에서 더 효율적인 방법을 알지 못합니다. 설정 내에서 수행하려는 작업을 지정할 수있는 방법이 없기 때문입니다. @Evan Trimboli가이 접근 방식을 추천 해 주었고 Sencha ExtJs의 개발자임을 확신합니다. 어쨌든, 당신이 당신의 대답을 찾길 바랍니다! – tommyO

+0

귀하의 바이올린이 자신을 시도하지 않습니다. –

+0

@MAKRipon 그것은 당신이 지정한 방식으로 절대적으로 작동합니다. - 그냥 두 번 확인해 봤어. 나는 콤보에 상점을 부착하지 않았습니다. 왜냐하면 당신이 예제를 위해서 단지 콤보를 타이핑 할 수 있다고 생각했기 때문입니다. 그러나 "작동하지 않습니다"라고 말하면 더 구체적으로 기재하십시오. 문제가있을 경우 문제를 해결할 수 있습니다. 감사. – tommyO