Próbuję uzyskać liczbę przedmiotów w polu Combo, dzięki czemu mogę wprowadzić pierwszą wartość domyślnie widoczną w polu Combo za pomocą metody GetCount (), ale widzę, że zawsze powraca 0, więc nie można uzyskać pierwszego elementu, który ma być wyświetlany W polu Combo.

Kod dla mojego pola Combo jest jak pokazano poniżej:

Ext.define('something....', {
    controller: 'some Controller',

    initComponent: function() {
        var me,
        me = this;

        me.items = [{
            xtype: 'form',
            items: [{
                xtype: 'combo',
                itemId: 'nameId',
                name:'nameId',
                labelAlign: 'top',
                fieldLabel: 'Name',
                store: me._getNames(),
                //disabled:some condition?true:false,//doesn't gray out combo 
                valueField:'dataId',
                displayField: 'firstName',
                editable: false,
                listeners:{
                   afterrender: function(combo,component) {
                    var combo = me.down('#nameId'); 
                    var nameStore = combo.getStore(); 
                    var setFirstRecord = function(combo){
                        var nameStore = combo.getStore(); 
                        if(nameStore.getCount() === 1){
                            combo.setValue(nameStore.getAt(0)); 
                        }
                    }

                    if(nameStore.isLoaded() === false){
                        nameStore.on('load', function(nameStore){
                            setFirstRecord(combo);
                        },this,{
                            single:true
                        });
                    }else{
                        setFirstRecord(nameStore); 
                    }
                   },
               }
            }]
        }];
    }

Kod sklepu jest jak poniżej:

    _getNames: function (){
        var nameStore = Ext.create('Ext.data.Store', {
            autoLoad: true,
            proxy: {
                type: 'ajax',
                url: 'name.json',
                reader: {
                    type: 'json',
                    rootProperty:'items',
                    transform: function (data) {
                        var data = {
                           items: [{
                              dataId: data[0].dataId,
                              firstName: data[0].name.firstName,
                              nameDetails: data[0].nameDetails
                           }]
                        }
                        return data;
                    }
                },
            }, 
            fields: ['dataId', 'firstName','nameDetails']
        });

        return namesStore;
    }
})

Wynik zwrócony z interfejsu API, aby wypełnić sklep, jest następujący:

[
   {
      "dataId":1,
      "name":{
         "dataId":1,
         "firstName":"Julie",
         "code":"10",
         "connectionList":[
            "EMAIL"
         ]
      },
      "nameDetails":{
         "EMAIL":{
            "dataId":1,
            "detail":"EMAIL"
         }
      }
   }
]

Wszelkie sugestie dotyczące tego, czego brakuje, byłoby świetnie!

1
Ash 12 marzec 2021, 21:26

2 odpowiedzi

Najlepsza odpowiedź

Pisuję ten przykład dla Ciebie w Sencha Fiddle: HTTPS: //fiddle.sencha. COM / # Widok / Edytor & AMP; Fiddle / 3CDL

To rozwiązuje twój problem:

combo.getStore().on("load",
    function (store, records, successful, operation, eOpts) {
        if (store.getData().length > 0)
            combo.setValue(store.getData().get(0).getData().id)
    },
    this
)
0
César Zea Gómez 12 marzec 2021, 20:17

Musisz sprawdzić, czy sklep jest załadowany lub nie i napisz odpowiedni kod:

...
...
xtype: 'combo',
itemId: 'nameId',
name: 'nameId',
labelAlign: 'top',
fieldLabel: 'Name',
store: this._getNames(),
valueField: 'dataId',
displayField: 'firstName',
editable: false,
listeners: {
    afterrender: function (combo) {
        var store = combo.getStore();
        var setFirstRecord = function (combo) {
            var store = combo.getStore();
            if (store.getCount() === 1) {
                combo.setValue(store.getAt(0));
            }
        }
        if (store.isLoaded() === false) {
            store.on('load', function (store) {
                setFirstRecord(combo);
            }, this, {
                single: true
            });
        } else {
            setFirstRecord(combo);
        }
    }
}
...
...
0
Arthur Rubens 12 marzec 2021, 20:18