6

jEditableを使用して選択ドロップダウンをテーブル行に追加するために使用しているコードは次のとおりです。

$('tr',this).find('td:eq(8)').css('cursor','pointer')
    .editable( 'update.php', {
        'type': "select",
        'loadurl': 'json.php',
        'onblur': 'submit',
        'callback': function( value, settings ) {
         // etc.
        }); 

問題は、ドロップダウンのオプションが目的の順序で並べ替えられていないことです。元の JSONjson.phpは (クライアントの要求に従って) 名で並べられています。

{"0":"Select driver...", "48":"Ashley Solis", "43":"Casey Segal", // etc. 

ただし、最終的な Web ページでは、選択ドロップダウンのオプションが番号順に並べ替えられています。

jEditable は、必要のないときに JSON データを再ソートしているようです。これを修正するにはどうすればよいですか?

4

5 に答える 5

10

はるかに簡単な回避策: 値を非数値にします。先頭などに「_」を追加し、選択後に値を使用するときにそれを削除します。

{"_0":"Select driver...", "_48":"Ashley Solis", "_43":"Casey Segal", // etc. 

これにより、順序が保持されるはずです(少なくとも私がテストしたブラウザーでは)。

于 2013-10-24T01:31:19.527 に答える
4

原因

問題の根本は jEditable にあるのではなく、選択ドロップダウンを作成するために使用している JSON が単一のオブジェクトであるという事実にあります。JavaScript は、オブジェクト プロパティをソートされていないものとして扱います。これは、jEditable 1.7.1 のキー コードです (492 行目から)。

 /* If it is string assume it is json. */
 if (String == data.constructor) {      
     eval ('var json = ' + data);
 } else {
 /* Otherwise assume it is a hash already. */
     var json = data;
 }
 for (var key in json) {
 // starts looping through the object properties

通常は、for (var key in json)作成された順序で JSON プロパティをループする必要があります。代わりに、数値 (「アルファベット」) 順にループされます。


修正

これを解決するには多くの方法がありますが、最も簡単なのは、匿名で作成された jEditable プラグインを使用することです。このプラグインは、Google 検索で Pastebin で見つけました。これを新しい JavaScript ファイルに貼り付け、 jEditableのに HTML ファイルにロードします。

<script src="/js/jquery.jeditable.min.js"></script>
<script src="/js/jquery.jeditable.plugins.js"></script>

さらに、json.phpファイルを変更する必要があります。JSON をオブジェクトとして返す代わりに、次のようにします。

{"0":"Select driver...", "48":"Ashley Solis", "43":"Casey Segal", // etc. 

次のような線形配列として JSON を返す必要があります。

[" Select driver...||0","Ashley Solis||48","Casey Segal||43", // etc.

文字列「Select driver...」の先頭に空白を使用していることに注意してください。これにより、最初の位置にソートされます。他の場所で使用されていない限り、他の JavaScript を変更する必要はありませjson.phpん。


プラグイン

Pastebin で見つけた完全な jEditable プラグインは次のとおりです。

// type: select (based on 1.7.1, added feature: sorted options)
$.editable.addInputType("select", {
    element: function (settings, original) {
        var select = $('<select />');
        $(this).append(select);
        return (select);
    },
    content: function (data, settings, original) {
        /* If it is string assume it is json. */
        if (String == data.constructor) {
            eval('var json = ' + data);
        } else {
            /* Otherwise assume it is a hash already. */
            var json = data;
        }

        var aData = [];
        for (var key in json) {
            if (!json.hasOwnProperty(key)) {
                continue;
            }
            if ('selected' == key) {
                continue;
            }

            aData.push(json[key] + "||" + key);
        }

        // Sort
        aData.sort();

        // Create
        for (var key in aData) {
            var aDataSplit = aData[key].split("||");

            var option = $('<option />').val(aDataSplit[1]).append(aDataSplit[0]);
            $('select', this).append(option);
        }

        /* Loop option again to set selected. IE needed this... */
        $('select', this).children().each(function () {
            if ($(this).val() == json['selected'] || $(this).text() == $.trim(original.revert)) {
                $(this).attr('selected', 'selected');
            }
        });
    }
});
于 2013-08-20T16:26:55.230 に答える
3

同じ問題があり、「 server_ordered_select 」というカスタム入力タイプを作成することになりました。それを使用するには、いくつかのことを行う必要があります。

  1. サーバーの応答を変更して、代わりにオブジェクトの配列を返します。各オブジェクトには、ID とラベルのキーと値のペアが 1 つだけあります。例えば

    "[{'197':'Sterling'}, {'199':'US Dollar'}, {'185':'Canadian Dollar'}, {'200':'Yen'}]"
    
  2. jEditable init コードの前のどこかに次を追加します。

    $.editable.addInputType('server_ordered_select', {
        element : function(settings, original) {
            var select = $('<select />');
            $(this).append(select);
            return(select);
        },
        content : function(data, settings, original) {
            /* If it is string assume it is json. */
            if (String == data.constructor) {
                eval ('var json = ' + data);
            } else {
                /* Otherwise assume it is a hash already. */
                var json = data;
            }
            var isArray = Object.prototype.toString.call(json) === '[object Array]',
                selected = "";
            for (var key in json) {
                var k, v;
                if (isArray) {
                    k = Object.keys(json[key])[0];
                    v = json[key][k];
                    if ('selected' == k) {
                        selected = v;
                        continue;
                    }
                } else {
                    if (!json.hasOwnProperty(key)) {
                        continue;
                    }
                    if ('selected' == key) {
                        selected = json['selected'];
                        continue;
                    }
                    k = key;
                    v = json[key];
                }
                var option = $('<option />').val(k).append(v);
                $('select', this).append(option);
            }
            /* Loop option again to set selected. IE needed this... */
            $('select', this).children().each(function() {
                if ($(this).val() == selected ||
                    $(this).text() == $.trim(original.revert)) {
                    $(this).attr('selected', 'selected');
                }
            });
        }
    });
    
  3. 編集可能な初期化オプションで、編集可能なタイプを「server_ordered_select」に変更します。

    $('tr',this).find('td:eq(8)').css('cursor','pointer')
    .editable( 'update.php', {
        'type': "server_ordered_select",
        'loadurl': 'json.php',
        'onblur': 'submit',
        'callback': function( value, settings ) {
            // etc.
        });
    

入力タイプは、「select」タイプの通常の json 応答とも互換性があるはずですが、サーバーからの順序は保持されません。

于 2013-11-19T02:29:36.540 に答える
1

上記のソリューションのいずれかを実装しようとしていたときに、生成された JSON を調整できる場合、X-Editable が次の機能をサポートするようになったことに気付きました。

リストのソース データ。配列の場合 - 次の形式にする必要があります。

[{value: 1, text: "text1"}, {value: 2, text: "text2"}, ...]

---8<---

1.4.1 以降、OPTGROUP のレンダリングがサポートされているキーの子 (選択入力のみ)。

[{text: "group1", children: [{value: 1, text: "text1"}, {value: 2, text: "text2"}]}, ...]

ソース: https://vitalets.github.io/x-editable/docs.html

于 2016-06-03T13:34:08.630 に答える