3

サーブレットから受け取ったJSON文字列が入力されているコンボボックスがあります。

$(document).ready(function() {
    //Combobox Init (From Servlet)
    var comboBoxDataSource = new kendo.data.DataSource({
        transport : {
            read : {
                url : "net/samso/action/common/ComboAction?flag=SRCHGT_IO_GB", // url to remote data source 
                dataType : "json",
                type : 'GET'
            }
        },
        schema : {
            model : {
                fields : {
                    key : {
                        type : "string"
                    },
                    value : {
                        type : "string"
                    }
                }
            }
        }
    });

    //Manually add an item
    comboBoxDataSource.add({key: "062", value: "Total"});

    //Initialize Combobox
    $("#cb_srchgt_io_gb").kendoComboBox({
        dataSource : comboBoxDataSource,
        dataTextField : "value",
        dataValueField : "key"
    })
});

データソースにアイテムを手動で追加しようとするまで、コードは正常に機能しますcomboBoxDataSource.add({key: "062", value: "Total"});。アイテムが追加されると、データソースのJSONデータから入力された他のアイテムが削除されます。

なぜこうなった?

4

1 に答える 1

7

問題は、DataSource が非同期で初期化されることです。つまり、初期化時にロードを開始しcomboboxますが、データがサーバーから返されるまで操作は終了しません。それから、その要素を呼び出す必要があるのはそのときだけです。addサーバーからの読み込みには数ミリ秒または数秒かかる場合があるため、ステートメントをサンプル コードの最後に移動することもできません。

サーバーから受信しているものに要素を追加したい場合は、次を使用できます。

$(document).ready(function () {
    //Combobox Init (From Servlet)
    var comboBoxDataSource = new kendo.data.DataSource({
        transport: {
            read: {
                url     : "net/samso/action/common/ComboAction?flag=SRCHGT_IO_GB", // url to remote data source 
                dataType: "json",
                type    : 'GET'
            }
        },
        schema   : {
            model: {
                fields: {
                    key  : { type: "string" },
                    value: { type: "string" }
                }
            },
            data: function(result) {
                //Manually add an item
                result.push({key: "062", value: "Total"});
                return result
            }
        }
    });

    //Initialize Combobox
    $("#cb_srchgt_io_gb").kendoComboBox({
        dataSource    : comboBoxDataSource,
        dataTextField : "value",
        dataValueField: "key"
    })
});

event を使用して同じことを行いrequestEnd、余分な要素を にプッシュすることができますe.response:

requestEnd: function (e) {
    console.log("e", e);
    e.response.push({key: "062", value: "Total"});
}

基本的に、サーバーからデータを受信した後に発生するイベントは問題ありません。

于 2013-03-21T07:45:23.180 に答える