0

私の英語でごめんなさい。私はこれが初めてなので、ここで少し助けていただければ幸いです。私はhtmlフォームを持っており、そのデータは私のページのhtmlテーブルに表示されています。新しいフォーム データ テーブルを保存するたびに、フォーム エントリ ID で並べ替えられます。

今、並べ替えとページネーションに行き詰まっています。たとえば、animal_idまたはなど、他のデータの列ヘッダーをクリックして、このテーブルデータを並べ替えるにはanimal_name.

ご協力いただきありがとうございます

コードは次のとおりです。

        init: function() {
                if (!Animals.index) {
                window.localStorage.setItem("Animals:index", Animals.index = 1);
            }
            Animals.$form.reset();
            Animals.$button_discard.addEventListener("click", function(event) {
                Animals.$form.reset();
                Animals.$form.id_entry.value = 0;
            }, true);
            Animals.$form.addEventListener("submit", function(event) {
                var entry = {
        id: parseInt(this.id_entry.value),
                    animal_id:this.animal_id.value,
        animal_name: this.animal_name.value,
        animal_type: this.animal_type.value,
                    bday: this.bday.value,
                    animal_sex: this.animal_sex.value,
                    mother_name: this.mother_name.value,
                    farm_name: this.farm_name.value,
        money: this.money.value,
        weight: this.weight.value,
                    purchase_partner: this.purchase_partner.value,

                };
                if (entry.id == 0) { // add
                    Animals.storeAdd(entry);
                    Animals.tableAdd(entry);
                }
                else { // edit
                    Animals.storeEdit(entry);
                    Animals.tableEdit(entry);
                }

                this.reset();
                this.id_entry.value = 0;
                event.preventDefault();
            }, true);


            if (window.localStorage.length - 1) {
                var animals_list = [], i, key;
                for (i = 0; i < window.localStorage.length; i++) {
                    key = window.localStorage.key(i);
                    if (/Animals:\d+/.test(key)) {
                        animals_list.push(JSON.parse(window.localStorage.getItem(key)));
                    }
                }

                if (animals_list.length) {
                            animals_list.sort(function(a, b)
                            {return a.id < b.id ? -1 : (a.id > b.id ? 1 : 0);
                                                           })

                        .forEach(Animals.tableAdd);

                                                } }


            Animals.$table.addEventListener("click", function(event) {
                var op = event.target.getAttribute("data-op");
                if (/edit|remove/.test(op)) {
                    var entry = JSON.parse(window.localStorage.getItem("Animals:"+ event.target.getAttribute("data-id")));
                    if (op == "edit") {
            Animals.$form.id_entry.value = entry.id;
                        Animals.$form.animal_id.value = entry.animal_id;
            Animals.$form.animal_name.value = entry.animal_name;
                        Animals.$form.animal_type.value = entry.animal_type;
                        Animals.$form.bday.value = entry.bday;
                        Animals.$form.animal_sex.value = entry.animal_sex;
                        Animals.$form.mother_name.value = entry.mother_name;
            Animals.$form.farm_name.value = entry.farm_name;
                        Animals.$form.money.value = entry.money;
                        Animals.$form.weight.value = entry.weight;
                        Animals.$form.purchase_partner.value = entry.purchase_partner;

                    }
                    else if (op == "remove") {
if (confirm('Are you sure you want to remove this animal from your list?' )) {
                            Animals.storeRemove(entry);
                            Animals.tableRemove(entry);
                        }
                    }
                    event.preventDefault();
                }
            }, true);
        },

        storeAdd: function(entry) {
            entry.id = Animals.index;
            window.localStorage.setItem("Animals:index",++Animals.index);
            window.localStorage.setItem("Animals:"+entry.id,JSON.stringify(entry));
        },
        storeEdit: function(entry) {
            window.localStorage.setItem("Animals:"+entry.id,JSON.stringify(entry));
        },
        storeRemove: function(entry) {
            window.localStorage.removeItem("Animals:"+ entry.id);
        },

        tableAdd: function(entry) {
            var $tr = document.createElement("tr"), $td, key;
            for (key in entry) {
                if (entry.hasOwnProperty(key)) {
                    $td = document.createElement("td");
                    $td.appendChild(document.createTextNode(entry[key]));
                    $tr.appendChild($td);
                }
            }
            $td = document.createElement("td");
            $td.innerHTML = '<a data-op="edit" data-id="'+ entry.id+'">Edit</a> | <a data-op="remove" data-id="'+ entry.id +'">Remove</a>';
            $tr.appendChild($td);
            $tr.setAttribute("id", "entry-"+ entry.id);
            Animals.$table.appendChild($tr);
        },
        tableEdit: function(entry) {
        var $tr = document.getElementById("entry-"+ entry.id), $td, key;
            $tr.innerHTML = "";
            for (key in entry) {
                if (entry.hasOwnProperty(key)) {
                    $td = document.createElement("td");
                    $td.appendChild(document.createTextNode(entry[key]));
                    $tr.appendChild($td);
                }
            }
            $td = document.createElement("td");
            $td.innerHTML = '<a data-op="edit" data-id="'+ entry.id +'">Edit</a> | <a data-op="remove" data-id="'+ entry.id +'">Remove</a>';
            $tr.appendChild($td);
        },
        tableRemove: function(entry) {
            Animals.$table.removeChild(document.getElementById("entry-"+ entry.id));
        }
    };


    Animals.init();
4

1 に答える 1

0

現在のアプローチは、テーブル HTML と動物データをコードで直接管理することであるため、データの並べ替えとテーブルの書き換えをコードで行う必要があります。つまり、列ヘッダーでクリック イベントをリッスンし、その特定の列に従って動物データを並べ替えてから、テーブルを完全に再描画する必要があります。テーブルを再描画するには、少し時間がかかるかもしれませんが、表示されているすべての動物に対して tableRemove() 関数をループし、次に tableAdd() 関数をループするだけです。各列によるデータの並べ替えは、もう少し混乱しているため、以下に解決策があります。

RIA (Rich Internet Application) フレームワークがテーブル情報を処理できるようにすることをお勧めします。これらのフレームワーク (EXT-JS、YUI など) の多くは、コーディングを大幅に簡素化するテーブル コントロールを提供します。データへの参照 (関連する形式でフォーマットされたもの) を与えるだけで、並べ替えと表示が行われます。

HTML テーブルを自分で作成したいが、データの並べ替えに関心がある場合は、SequelSphereなどのクライアント側データベース ソリューションを使用することをお勧めします。SequelSphere を使用すると、次のようにテーブルを作成して動物データを管理できます。

db.catalog.createTable({
    tableName: "animals",
    columns: ["id_entry", "animal_id", "animal_name", "animal_type",
            "bday", "animal_sex", "mother_name", "farm_name", "money",
            "weight", "purchase_partner"],
    primaryKey: ["id_entry"]
});

次に、次のように行を挿入/更新/削除できます。

db.catalog.getTable("animals").insertRow(
     [ entry.id, entry.animal_id, entry.animal_name, entry.animal_type,
     entry.bday, entry.animal_sex, entry.mother_name, entry.farm_name,
     entry.money, entry.weight, entry.purchase_partner ]
);

最後に、次の select ステートメントの ORDER BY 句を変更するだけで、ユーザーがクリックした列でデータを並べ替えることができます。

var sql =   "SELECT id_entry, animal_id, animal_name, animal_type, " +
            "       bday, animal_sex, mother_name, farm_name, money, " +
            "       weight, purchase_partner " +
            "  FROM animals " +
            " ORDER BY animal_sex "; // why did I choose this column?
var sortedEntries = db.query(sql);

そうそう、 SequelSphereは window.localStorageにもデータを保存するので、それも書く必要はありません。また、SQL とカーソルを完全にサポートしているため、ページネーションの管理も少し簡単になります。

お役に立てれば!

ジョン...

于 2012-10-12T14:33:22.947 に答える