0

私の 2 番目の選択ドロップダウンには、サーバーから返されるデータの各文字が入力されており、各項目自体ではありません。

ここに画像の説明を入力

これが私の JQuery です。

var selected_table = $("#id_TableName option:selected").text();
            $.get('/historicaldata/input_parameters/', { selected_table : selected_table }, function(data){
                for (var i = 0; i < data.length; i++) {
                    for (var key in data[i]) {
                        $('<option />', {
                            value: key,
                            text: data[i][key]
                        }).appendTo("#id_ColumnName");
                    }
                }
            });

GET リクエストの後にビューから返されると、データは次のようになります。

{'option1': ['option1'], 'option2': ['option2'], 'option3': ['option3']}

私はいくつかの同様のフォーマットを試しましたが、結果は同じなので、JQuery に問題があると思います。

ありがとう!

4

2 に答える 2

1

2 つの問題:

  1. サーバーが返信で正しいContent-Typeヘッダーを返していないように見えるため、jQuery はそれが JSON であることを認識せず、自動逆シリアル化します。したがって、ループは文字列の文字をループします。

    jQuery.parseJSON(ショートカット$.parseJSONを使用する場合)への呼び出しを追加することで、問題を強制できます。$

    data = jQuery.parseJSON(data);
    

    ...成功ハンドラーの最初の行として(以下のコンテキストで示されています)、より良いオプションはContent-Type、サーバーが送り返すことを修正することです. サーバーが送り返すコンテンツ タイプは ですapplication/json

  2. あなたのコードは配列を返すことを期待していますが、

    {'option1': ['option1'], 'option2': ['option2'], 'option3': ['option3']}
    

    ...引用しましたが、配列を送り返しているのではなく、JSON オブジェクトのようなものを送り返しています (ただし、引用符が無効です。以下の #3 を参照してください)。以下の #3 を修正したら、for (var propName in data)( propNamewill be "option1""option2"など、保証された順序ではありません) を使用してプロパティの名前をループできます。特定の順序が必要な場合は、代わりに配列を出力するようにサーバー側の出力を変更します。

    ["option1", "option2", "option3"]
    

    ...そして、既存のループに固執します。

  3. 返送しようとしている JSON は無効です。JSON では、プロパティ名と文字列を単一引用符 ( ) ではなく、二重引用符 ( ) で囲む必要があります。そう:"'

    {"option1": ["option1"], "option2": ["option2"], "option3": ["option3"]}
    

    ...または、配列を使用します。

    ["option1", "option2", "option3"]
    

コンテキスト内のparseJSON呼び出しは次のとおりですが、サーバーが正しいContent-Typeを返した方がよいでしょう。データへのアクセス方法も更新する必要があります。

var selected_table = $("#id_TableName option:selected").text();
$.get('/historicaldata/input_parameters/', {
    selected_table: selected_table
}, function(data) {
    data = $.parseJSON(data);     // <====== Added
    for (var i = 0; i < data.length; i++) {
        for (var key in data[i]) {
            $('<option />', {
                value: key,
                text: data[i][key]
            }).appendTo("#id_ColumnName");
        }
    }
});
于 2014-07-28T13:54:39.990 に答える
0

これはあなたの例です(文字列を取得しています):

デモ: http://jsfiddle.net/5JNSz/

文字列を修正すると、正しくなり、 OR jqueryjsonを使用します。JSON.parse()$.parseJSON

デモ: http://jsfiddle.net/dv9Ly/

length注: オブジェクトにはプロパティがありません。

コンテンツ タイプの問題を修正すると、次のように動作するはずです。

for (var key in data) {
    $('<option />', {
        value: key,
        text: data[key][0]
    }).appendTo("#id_ColumnName");
}

デモ: http://jsfiddle.net/Vm7jQ/

于 2014-07-28T13:59:43.973 に答える