0

JSP 内で Ext JS コンボボックスを使用しています。ページを初めてロードしたときに、コンボボックスが表示されません。関連するストアが定義されていないというエラーが Firebug コンソールに表示されます。(TypeError: cpStore is undefined)

ただし、次のリクエストは正常に機能することに気付きました。

この問題を回避するために私ができることを提案してください。

function displayCPBox(idPrefix){

    var cpSelectList = Ext.create ('Ext.data.JsonStore', {
        storeId: idPrefix+'cpSelectStore',
        remoteSort: true,
        autoLoad: true,
        proxy: {
            type: 'ajax',
            url: proyecto + 'extjs/data/cpData.jsp',
            reader: {
                type: 'json',
                root: 'data',
                idProperty: 'id'
            }
        },
        fields: [
            {name:'id', type: 'float'},
            {name:'codigo', type: 'string'}
        ]

    });

    var multiCombo = Ext.create('Ext.form.field.ComboBox', {
        fieldLabel: 'CP',
        renderTo: idPrefix+'cpSelectCombo',
        id: idPrefix + 'cpSelectComboBox',
        displayField: 'codigo',
        valueField : 'id',
        width: 200,
        labelWidth: 50,
        store: cpSelectList,
        queryMode: 'remote',
        minChars: 1,
        cls : 'cp-margin',
        listeners :{
            select: function( combo, records, eOpts ){
                getZipInfoForCodigoFormFields(records,document.getElementById(idPrefix+'localidad')  ,document.getElementById(idPrefix+'provincia'),document.getElementById(idPrefix+'pais'),doc           ument.getElementById(idPrefix+'zona'));
            }
        }
    });

}

ロード中に値を設定するコード:

var cpStore = Ext.data.StoreManager.lookup('<%=idPrefix%>'+'cpSelectStore');
cpStore.on('load',function() {
    <%
        Long zipCodeForDisplayLong =  oportunidad.getId_lib_cp();
        long zipCodeForDisplay =   (zipCodeForDisplayLong == null) ? -1 : zipCodeForDisplayLong.longValue();
    %>
    var selectedzipCodeValue=  <%=zipCodeForDisplay %>;
    if(selectedzipCodeValue != -1)
    {
        var selectedCPVal =  cpStore.findRecord("id",selectedzipCodeValue);
        Ext.getCmp('<%=idPrefix%>'+'cpSelectComboBox').setValue(selectedCPVal.get("id"));
    }
});

cpStore.load();
4

1 に答える 1

0

あなたがスコーピングの問題を抱えているなら、私はあなたの息子に申し訳ありません...

スコープをパラメーターとして関数に渡す必要があります

cpStore.on('load', function(cpStore), this {
  ...cpStore.findRecord()
});

これで、cpStore がストア参照になります。


その時点でリスナーをストアに設定しているのは、ちょっと奇妙だと思いました。実際にストアを作成している場所はわかりませんが、これはおそらくもっときれいだと思います。

var cpStore = Ext.create('Path.to.store.class');
cpStore.on({
    load: this.onCpStoreLoad,
    scope: this
});

onCpStoreLoad: function(cpStore) {

}
于 2013-06-12T17:39:01.807 に答える