2

ページからの応答としてjson配列文字列を取得しています。コンボボックスでバインドしたい。

これは私にjson配列文字列を与える成功ブロックです:

json配列文字列は次のようになります。

json配列文字列を表示するメッセージボックス

コンボボックスのドロップダウンでこれをバインドするための鍬を教えてください。

よろしく、

編集:

これは私が試した最新のコードです:

Ext.define('Country',{
extend: 'Ext.data.Model',
fields: [
    { name: 'id', type: 'string' },
    { name: 'name', type: 'string' }
]
});

Ext.define('CountryCombo', {
extend: 'Ext.form.field.ComboBox',
alias: 'widget.countrycombo',
allowBlank: false,
queryMode: 'local',
valueField: 'id',
displayField: 'name',
store: {
    model: 'Country',
    data: [
        { id: 'China', name: 'China'},
        { id: 'Japan', name: 'Japan'},
        { id: 'Malaysia', name: 'Malaysia'}
    ]
},
listeners: {
    "select": function(obj){  
        Ext.Ajax.request({
            url: '/CellEditing/FormServlet',
            method: 'POST',
            params: {
                data: obj.getValue()
            },
            success: function(obj){
                alert('success');
                alert(obj.responseText);
                console.log(StateCombo.storeStates); //This is undefined hence getting error
                StateCombo.storeStates.loadData(obj.responseText);
            },
            failure: function(obj){
                alert('failure');
            }
        });                 
    }
}
});

var storeStates = Ext.create('Ext.data.Store', {
autoLoad: false,
fields: ['State']
});

Ext.define('State',{
extend: 'Ext.data.Model',
fields: [
    { name: 'id', type: 'int' },
    { name: 'name', type: 'string' }
]
});

Ext.define('StateCombo', {
extend: 'Ext.form.field.ComboBox',
alias: 'widget.statecombo',
queryMode: 'local',
valueField: 'State',
displayField: 'State',
store: storeStates
});

これは私が試した最新のものですが、それでも1番目のコンボボックスから何かを選択すると、2番目のコンボボックスにデータが入力されません。これに関するヘルプはありますか?

4

5 に答える 5

4

技術的には、このコードは機能します。

http://jsfiddle.net/sdt6585/wPzPD/29/

Ext.define('Country',{
    extend: 'Ext.data.Model',
    fields: [
        { name: 'id', type: 'string' },
        { name: 'name', type: 'string' }
    ]
});

Ext.define('CountryCombo', {
    extend: 'Ext.form.field.ComboBox',
    alias: 'widget.countrycombo',
    allowBlank: false,
    queryMode: 'local',
    valueField: 'id',
    displayField: 'name',
    store: {
        model: 'Country',
        data: [
            { id: 'China', name: 'China'},
            { id: 'Japan', name: 'Japan'},
            { id: 'Malaysia', name: 'Malaysia'}
        ]
    },
    listeners: {
        "select": function(obj){
            Ext.Ajax.request({
                url: '/CellEditing/FormServlet',
                method: 'POST',
                params: {
                    data: obj.getValue()
                },
                callback: function (response, operation) {
                    //This should be the text string in reponseText, just putting it there since I don't have it
                    response.responseText = '{data: [{state: "State One"}, {state: "State Two"}, {state: "State Three"}]}'
                    //Put this in your success function
                    var data = Ext.JSON.decode(response.responseText).data;
                    storeStates.loadData(data);
                }
            });
        }
    }
});

var storeStates = Ext.create('Ext.data.Store', {
    autoLoad: false,
    fields: ['state']
});

Ext.define('State',{
    extend: 'Ext.data.Model',
    fields: [
        { name: 'id', type: 'int' },
        { name: 'name', type: 'string' }
    ]
});

Ext.define('StateCombo', {
    extend: 'Ext.form.field.ComboBox',
    alias: 'widget.statecombo',
    queryMode: 'local',
    valueField: 'state',
    displayField: 'state',
    store: storeStates
});

Ext.form.Panel.create({
    title: 'Tester',
    renderTo: Ext.getBody(),
    items: [
        CountryCombo.create(),
        StateCombo.create()
    ]
});​

主な変更点は次のとおりです。

  • ajax呼び出しの成功関数で、Ext.JSON.decode(response.responseText))で返されたjson文字列をデコードする必要があります
  • 状態モデルを定義しましたが、状態ストアはそれを使用しませんでした。取り外すことができます。
  • json文字列を除くすべての場所で状態変数を大文字にしました。小文字に修正しました。
  • 状態コンボへの参照は、そのビューのテンプレートクラスのみであり、そのインスタンスへの参照ではありませんでした。さらに、初期化されたクラスの場合、そのストアプロパティはそのように定義され、変数名とは関係ありません。作成したコンボボックスへの参照を保存して、そのストアプロパティのloadData関数を呼び出すか、または私が行ったように、ストアへのstoreStates参照を使用してデータをロードすることができます。

これは技術的には機能しますが、最も洗練されたソリューションではありません。このプロセスに従うには、はるかに保守しやすいコードを使用することになります。

  1. 国と州のモデルを定義し(理想的にはグローバル名前空間にない!!)、json応答を自動的にデコードするためのプロキシを州ストアに提供します。
  2. モデルをベースとして使用するストアを定義します
  3. コンボボックスのビューを定義します(他の場所で再利用される場合のみ)
  4. コンボボックスのインスタンスをある種のコンテナに配置します(ビュークラスのExt.create()またはcreate()関数を使用します。
  5. 作成したカントリーコンボのインスタンスにリスナーをアタッチし、stateComboのストアのload関数を呼び出させます。

Ext.define('MyApp.models.Country',{
    extend: 'Ext.data.Model',
    requires: ['Ext.data.SequentialIdGenerator'],
    idgen: 'sequential',
    fields: [
        { name: 'name', type: 'string' }
    ]
});

Ext.define('MyApp.stores.Country', {
    model: 'MyApp.models.Country',
    data: [
        { name: 'China'},
        { name: 'Japan'},
        { name: 'Malaysia'}
    ]
});

Ext.define('MyApp.models.State',{
    extend: 'Ext.data.Model',
    requires: ['Ext.data.SequentialIdGenerator'],
    idgen: 'sequential',
    fields: [
        { name: 'state', type: 'string' }
    ],
    proxy: {
        type: 'ajax',
        method: 'post',
        url: '/CellEditing/FormServlet',
        reader: {
            type: 'json',
            root: 'data',
            successProperty: false
        }
    }
});

Ext.define('MyApp.stores.State', {
    model: MyApp.models.State
});

Ext.define('MyApp.views.CountryCombo', {
    extend: 'Ext.form.field.ComboBox',
    alias: 'widget.countrycombo',
    allowBlank: false,
    queryMode: 'local',
    valueField: 'name',
    displayField: 'name',
    store: MyApp.stores.Country.create()
});

Ext.define('MyApp.views.StateCombo', {
    extend: 'Ext.form.field.ComboBox',
    alias: 'widget.statecombo',
    queryMode: 'local',
    valueField: 'state',
    displayField: 'state',
    store: MyApp.stores.State.create()
});

Ext.form.Panel.create({
    title: 'Tester',
    renderTo: Ext.getBody(),
    items: [
        countryCombo = MyApp.views.CountryCombo.create(),
        stateCombo = MyApp.views.StateCombo.create()
    ]
});

countryCombo.on('beforeselect', function (combo, record, index, eOpts) {
    stateCombo.store.load({
        params: {data: record.get('name')}
    });
});​
于 2012-10-22T22:28:52.820 に答える
2

loadDataメソッドを使用して、コンボボックスにデータをロードします。

yourCombo.store.loadData(obj.responsetext);
于 2012-10-13T05:31:49.917 に答える
2

StateComboはクラスの名前であり、オブジェクトインスタンス自体ではないため、使用できません。そのため、コードでストアにアクセスすることはできませんStateCombo.storeStates.

実際、ストアにアクセスしてデータをロードする場合は、2つの方法で実行できます。まず、ストアオブジェクトの作成時にstoreStates変数に保存するため、アクセスして使用できます。storeStatesはグローバル変数であるか、クロージャによって認識されます。したがって、次の句を記述することにより、必要な操作を実行します。

storeStates.loadData();

もう1つの方法は、コンボボックスコントロールにアクセスし、そのバインドされたストアを取得することです。コントロールにアクセスするということは、クラス名を使用しないことを意味しますが、それはインスタンスです。コンボボックスコントロールにアクセスするには、最初にコンボボックスの宣言を変更し、itemIdを設定してインスタンス名を定義する必要があります。

Ext.define('StateCombo', {

itemId: 'stateCombo',
extend: 'Ext.form.field.ComboBox',
alias: 'widget.statecombo',
queryMode: 'local',
valueField: 'State',
displayField: 'State',
store: storeStates
});

ウィジェットがわかると、次の場所で見つけることができます。

var arr = Ext.ComponentQuery.query('stateCombo');

これで、データをロードできます。

if (arr.length>0)
   arr[0].loadData();
于 2012-10-23T14:14:23.330 に答える
1

編集された投稿からの簡単な考え、応答は含まれています

{"data":[{"state":"sanghai"},{"state":"state2"}]}保管中の小文字の状態は、次のように定義されます。fields: ['State']

また、ajax応答はjson文字列であるためloadData、storeのメソッドを呼び出す前にデコードする必要があります。

お気に入りvar response = Ext.decode(obj.responseText);

次に、loadDataを次のように呼び出しますStateCombo.storeStates.loadData(response.data);

于 2012-10-21T12:18:27.950 に答える
1

2つの異なるストアにバインドされた2つのコンボボックスコントロールを使用する以下の例を見てみましょう。最初のコンボボックスを変更すると、選択した値に応じてデータを再読み込みする(私の例ではフィルタリングを行う)イベントが発生します。次に、2番目のコンボボックスのストアがリロードされ、コントロールが補充されます。

この例は、モデル、ストア、およびビューの両方がどのように連携して一緒に使用されるかを示しています。通常はローカルデータ収集を使用しますが、サーバー側からデータを取得するようにストアとプロキシを簡単に構成できます。

 // Set up a model to use in our Store
 Ext.define('Countries', {
     extend: 'Ext.data.Model',
     fields: [
         {name: 'abbr', type: 'string'},
         {name: 'name',  type: 'string'}
     ]
 });

// The data store containing the list of states
var countries = Ext.create('Ext.data.Store', {
    fields: ['abbr', 'name'],
    model: 'Countries', 
    data : [
        {"abbr":"US", "name":"United States"},
        {"abbr":"FR", "name":"France"}
        //...
    ]
});

 // Set up a model to use in our Store
 Ext.define('States', {
     extend: 'Ext.data.Model',
     fields: [
         {name: 'cntry', type: 'string'},
         {name: 'abbr', type: 'string'},
         {name: 'name',  type: 'string'}
     ]
 });

// The data store containing the list of states
var states = Ext.create('Ext.data.Store', {
    autoLoad: false,
    fields: ['abbr', 'name'],
    model: 'States', 
    data : [
        {"cntry": "US", "abbr":"AL", "name":"Alabama"},
        {"cntry": "US", "abbr":"AK", "name":"Alaska"},
        {"cntry": "US", "abbr":"AZ", "name":"Arizona"},
        {"cntry": "FR", "abbr":"PR", "name":"Paris"}
        //...
    ],
    listeners: {
        beforeload: function () {

        }
    }

});


// Create the combo box, attached to the states data store
var a = Ext.create('Ext.form.ComboBox', {
    fieldLabel: 'Choose Country',
    store: countries ,
    queryMode: 'local',
    displayField: 'name',
    valueField: 'abbr',
    // Basically this code was tested on Simple Online ExtJS Code Editor
    // http://ext4all.com/post/simple-online-extjs-code-editor
    // so it was bounded to the codeoutput control 
    renderTo: 'codeoutput', 
    listeners: {
        // when we change the value of Countries combobox, this event is raised
        change: function(obj, newVal, oldVal, eOpts) {
            // we can also use states.filter() function in the same way
            states.filterBy ( function(record, id) {
            // newVal variable is available due to closure, so we can compare the row with the selected country and result appropriate notification
            if (record.get("cntry")==newVal) return true;
          });
        }
    }
});


// Create the combo box, attached to the states data store
var a = Ext.create('Ext.form.ComboBox', {
    fieldLabel: 'Choose State',
    store: states,
    queryMode: 'local',
    displayField: 'name',
    valueField: 'abbr',
    renderTo: 'codeoutput'
});
于 2012-10-21T21:44:42.280 に答える