根据data- *属性筛选选择选项

时间:2013-05-08 12:13:37

标签: javascript jquery jquery-ui-selectmenu

我的页面上有2个选择菜单。

首先有3个值:All, Active, Unactive,第二个用来自服务器的数据填充。

我需要连接它们,以便当我从第一个select菜单中选择一个选项时,第二个select将只有某些选项(过滤第二个选择菜单)

我的想法是从服务器获取包含3个元素的数据:

[ { "Id": 1, "Name": "Active One",   "Active":true },
  { "Id": 2, "Name": "Active Two",   "Active":true },
  { "Id": 3, "Name": "Unactive One", "Active":false },
  { "Id": 4, "Name": "Unactive Two", "Active":false } ]

我要做的第二件事是将所有带有自定义属性的选项添加到选择中:

<option value=' + n[index].Id + ' data-active='+n[index].Active+'>' + n[index].Name + '</option>

我在过滤第二次选择时遇到问题。

我已经在插件中填充了第二个选择,因此重用它会更容易。

这是jsFiddle演示:http://jsfiddle.net/Misiu/pr8e9/4/

我希望这个工作是从填充select服务器用户之后将能够从第二个选择中选择每个选项,但是当他将首先更改时选择第二个将更新 - 仅显示适当的选项。
因此,如果他选择Active,他将只能选择Active OneActive Two

编辑: This正在努力解决@ oe.elvik

1 个答案:

答案 0 :(得分:1)

替代解决方案:

(function ($) {
    var meinData;
    $.fn.createOptions = function(filter) {
        var $this = this;
        var n = meinData
        var list = "";

        for (var index = 0; index < n.length; index++) {
            if(filter == -1 || (filter == 1 &&  n[index].Active) || (filter == 0 && !n[index].Active)){
                list += '<option value=' + n[index].Id + ' data-active='+n[index].Active+'>' + n[index].Name + '</option>';
            }
        }

        $this.filter("select").each(function () {
            $(this).empty();
            $(this).append(list);
            if ($.ui.selectmenu && defaults.selectmenu) {
                $this.selectmenu();
            }
        });
    }

    $.fn.ajaxSelect = function (options) {
        var $this = this;
        //options
        var settings = $.extend({}, defaults, options);
        //disable select
        if ($.ui.selectmenu && settings.selectmenu && settings.disableOnLoad) {
            $this.selectmenu('disable');
        }


        //ajax call
        $.ajax({
            type: settings.type,
            contentType: settings.contentType,
            url: settings.url,
            dataType: settings.dataType,
            data: settings.data
        }).done(function (data) {
            meinData = data.d || data;
            $($this).createOptions(-1)
            settings.success.call(this);
        }).fail(function () {
            settings.error.call(this);
        });

        return this;
    };

    var defaults = {
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: '/echo/json/',
        dataType: 'json',
        data: null,
        async: true,
        selectmenu: true,
        disableOnLoad: true,
        success: function () {},
        error: function () {}
    };
})(jQuery);


$(function () {
    var data = {
        json: $.toJSON({
            d: [{ "Id": 1, "Name": "Active One", "Active":true }, { "Id": 2, "Name": "Active Two", "Active":true },{ "Id": 3, "Name": "Unactive One", "Active":false }, { "Id": 4, "Name": "Unactive Two", "Active":false }]
        }),
        delay: 2//simulate loading
    };

    function ok() {
        $('select#me').selectmenu({ select: function(event, options) {
            $('select#mein').createOptions(options.value)
            }
        });
    }

    function error() {
        alert('there was a problem :(');
    }
    $('select#me').selectmenu().selectmenu('disable');
    $('select#mein').selectmenu().ajaxSelect({
        data: data,
        success: ok,
        error: error
    });
});