1

タグのリストのホルダーとして機能する multiselect-list があります。変更され、変更されたイベントと共に渡されるアイテムの値を適切に取得する方法がわかりません。これが私の剣道マルチセレクトです:

        @(Html.Kendo().MultiSelect()
          .Name("tags")
          .Placeholder("No tags selected for this unit")
          .BindTo(new SelectList(Model.TagsAvailable))
          .Events(e => e
                    .Select("select")
                    .Change("change"))
          .Value(Model.TagsSelected.ToArray())
          )

そして、ここに私のjsメソッドがあります:

        function select(e) {
            var dataItem = this.dataSource.view()[e.item.index()];
            var param = dataItem.Text;
            var url = '/UnitDetails/TagUnit/@Model.UnitId';

            $.ajax({
                url: url,
                data: { selectedItem: param },
                type: 'GET',
                dataType: 'json',
                success: function (data) {
                    // ...
                },
                error: function () {
                    // ...
                }
            });
        };

        function change(e) {
            var dataItem = this;
            var param = dataItem.element.context.innerText;
            var url = '/UnitDetails/UnTagUnit/@Model.UnitId';

            $.ajax({
                url: url,
                data: { selectedItem: param },
                type: 'GET',
                dataType: 'json',
                success: function (data) {
                    // ...
                },
                error: function () {
                    // ...
                }
            });
        };

私の問題は、paramの割り当てが迅速で汚いと感じていることです。確かに、これについてもっと正しい方法が他にあるはずですか?

4

2 に答える 2

8

変更を知るための簡単な方法はありません。だから、自分でやりましょう。

まず、次の関数を使用して古い値を保存します。

function saveCurrent(multi) {
    multi._savedOld = multi.value().slice(0);
}

引数として関数に渡す複数選択はどこmultiにありますか (そのため、複数の関数を使用できますmultiselects)。

次に、次のように実装する必要がありchangeます。

change    : function (e) {
    // Retrieve previous value of `multiselect` saved using previous function
    var previous = this._savedOld;
    // These are current values.
    var current = this.value();
    // Let's save it for the next time
    saveCurrent(this);

    // The difference between previous and current are removed elements
    var diff = $(previous).not(current).get();
    console.log("removed", diff);

    // The difference between current and previous, are added elements
    diff = $(current).not(previous).get();
    console.log("added", diff);
}

実行例はこちらhttp://jsfiddle.net/OnaBai/MapVN/

于 2013-07-04T23:05:01.603 に答える
1

ナイスアンサーオナバイ!非常に便利で役に立ちます。

私は同じニクラの問題を抱えていました。しかし、dataBound イベントで「現在の値を保存」する必要がありました。そしてそれは機能します(変更された値をログに記録します)。

アイテムの削除を開始すると、機能が「変更」を「アイテムの追加」として認識するため、失敗します。

これは私がしたことです

function dataBound(ev) {

        saveCurrent(this);
    }

    function saveCurrent(multi) {
        multi._savedOld = multi.value().slice(0);
    }

    function change(ev) {


        var previous = this._savedOld;

        var current = this.value();

        saveCurrent(this);

        var diff = $(previous).not(current).get();
        console.log("removed", diff);

        var removedSkill = diff;

        console.log("removedSkills", removedSkill);

        diff = $(current).not(previous).get();
        var addedSkill = diff;
        console.log("added", diff);
        console.log("addedSkills", addedSkill);

        if (addedSkill.length > 1 || removedSkill.length > 1) {

            if (addedSkill.length > 1) {

                addedSkill = addedSkill[addedSkill.length - 1];
                alert("Added skill code: " + addedSkill.toString());
            }

            if (removedSkill.length > 1) {
                removedSkill = removedSkill[removedSkill.length - 1];
                alert("Removed skill code: " + removedSkill.toString());
            }
        }
        else {
            if (addedSkill.length > 0) {
                alert("Added skill code: " + addedSkill.toString());
            }
            if (removedSkill.length > 0) {
                alert("Removed skill code: " + removedSkill.toString());
            }
        }


        $.ajax({
            url: "SomeUrl",
            type: "POST",
            dataType: "json",
            contentType: "application/json",
            data: JSON.stringify({ removedSkill: removedSkill, addedSkill: addedSkill })
        });
    }

再度、感謝します!

イヴァン

于 2016-01-23T14:32:52.847 に答える