在用到select2时,临时抱佛脚学习了一下

$(‘#e3‘).select2({

placeholder: "请输入",

minimumInputLength: 1,

separator: ",", // 分隔符

maximumSelectionSize: 5, // 限制数量

initSelection: function(element, callback) { // 初始化时设置默认值

},

createSearchChoice: function(term, data) { // 创建搜索结果(使用户可以输入匹配值以外的其它值)

return {

id: term.mid,

text: term.name

};

},

formatSelection: function(item) {

return item.name;//注意此处的name,要和ajax返回数组的键值一样

}, // 选择结果中的显示

formatResult: function(item) {

return item.name;//注意此处的name

}, // 搜索列表中的显示

ajax: {

url: "{:U(‘Admin/Member/getzj‘)}", // 异步请求地址

dataType: "json", // 数据类型

data: function(term, page) { // 请求参数(GET)

return {

q: term

};

},

results: function(data, page) {

return data;

}, // 构造返回结果

escapeMarkup: function(m) {

return m;

} // 字符转义处理

}

});

这个插件是基于Select的扩展插件,能够提供更加丰富的功能和用户体验,它的github官网地址为:https://select2.github.io/,具体的使用案例,可以参考地址:https://select2.github.io/examples.html

我们在整个框架里面,用到了很多Select2控件来处理内容的显示,包括单选的下拉列表(包括级联选择框)、复选的下拉列表、树形下拉列表等方式,界面效果如下所示。

1)编辑界面下的省份、城市、所在行政区的级联界面效果,选择省份,会加载对应省份下的城市,选择城市,会继续加载城市下的行政区,从而实现多级关联的下拉列表效果。

2)编辑界面下的多项选择下拉列表

但我们选择其中的内容的时候,系统自动显示出没有选择的列表数据,非常直观友好,如下所示。

3)树形列表的下拉列表

有时候,我们的一些数据可能有层次关系的,如所属机构、上层列表等等。

2、Select2控件的实际使用代码分析

1)基础界面代码及操作

使用select2控件,一般是在常规的select控件上,设置一下即可(设置它的class为select2)。

 <div class="col-md-6">
    <div class="form-group">
        <label class="control-label col-md-4">重要级别</label>
        <div class="col-md-8">
            <select id="Importance" name="Importance" class="form-control select2" placeholder="重要级别..."></select>
        </div>
    </div>
</div>
 <div class="col-md-6">
    <div class="form-group">
        <label class="control-label col-md-4">认可程度</label>
        <div class="col-md-8">
            <select id="Recognition" name="Recognition" class="form-control select2" placeholder="认可程度..."></select>
        </div>
    </div>
</div>

如果是固定列表,那么也就是设置它的Option内容即可,如下所示。

 <div class="col-md-6">
    <div class="form-group">
        <label class="control-label col-md-4">吸烟</label>
        <div class="col-md-8">
            <select id="Smoking" name="Smoking" type="text" class="form-control select2" placeholder="吸烟...">
                <option>吸烟</option>
                <option>不吸烟</option>
            </select>
        </div>
    </div>
</div>

简单的select2控件初始化代码如下所示。

$(document).ready(function() {
  $(".js-example-basic-single").select2();
});

一般情况下,如果允许复选多个项目,那么设置 multiple="multiple"即可,如下代码所示。

 <select id="ResponseDemand" name="ResponseDemand" multiple="multiple" class="form-control select2"></select>

2)异步数据绑定操作

一般情况下,我们的select控件的数据,是从数据库里面动态加载的,因此一般是通过Ajax方式获取数据并进行绑定即可。

基于代码可重用性的考虑,我们编写一个公用的JS函数,用来减少绑定操作的代码,提高代码重用性。

//绑定字典内容到指定的Select控件
function BindSelect(ctrlName, url) {
    var control = $(‘#‘ + ctrlName);
    //设置Select2的处理
    control.select2({
        allowClear: true,
        formatResult: formatResult,
        formatSelection: formatSelection,
        escapeMarkup: function (m) {
            return m;
        }
    });

    //绑定Ajax的内容
    $.getJSON(url, function (data) {
        control.empty();//清空下拉框
        $.each(data, function (i, item) {
            control.append("<option value=‘" + item.Value + "‘>&nbsp;" + item.Text + "</option>");
        });
    });
}

这样,绑定公用字典模块的数据,也就可以通过下面进一步封装处理即可。

//绑定字典内容到指定的控件
function BindDictItem(ctrlName, dictTypeName) {
    var url = ‘/DictData/GetDictJson?dictTypeName=‘ + encodeURI(dictTypeName);
    BindSelect(ctrlName, url);
}

这样我们初始化Select2 控件,并动态绑定对应的字典值或者其他数据,则可以通过下面初始化代码即可实现。其中BindDictItem就是直接绑定字典内容的操作,BindSelect则是根据URL进行数据的获取并绑定,而$("#Province").on("change", function (e) {});这样的函数处理,就是处理选择内容变化的联动操作了。

        //初始化字典信息(下拉列表)
        function InitDictItem() {
            //部分赋值参考
            BindDictItem("Area","市场分区");
            BindDictItem("Industry", "客户行业");
            BindDictItem("Grade","客户级别");
            BindDictItem("CustomerType", "客户类型");
            BindDictItem("Source", "客户来源");
            BindDictItem("CreditStatus", "信用等级");
            BindDictItem("Stage","客户阶段");
            BindDictItem("Status", "客户状态");
            BindDictItem("Importance",  "重要级别");     

            // 绑定省份、城市、行政区(联动处理)
            BindSelect("Province", "/Province/GetAllProvinceNameDictJson");
            $("#Province").on("change", function (e) {
                var provinceName = $("#Province").val();
                BindSelect("City", "/City/GetCitysByProvinceNameDictJson?provinceName="+ provinceName);
            });

            $("#City").on("change", function (e) {
                var cityName = $("#City").val();
                BindSelect("District", "/District/GetDistrictByCityNameDictJson?cityName="+ cityName);
            });
        }

而其中MVC控制器返回的数据,我们是返回一个JSON数据列表给前端页面的,他们的数据格式如下所示。

[ { "Text": "", "Value": "" }, { "Text": "学术会议", "Value": "学术会议" }, { "Text": "朋友介绍", "Value": "朋友介绍" }, { "Text": "广告媒体", "Value": "广告媒体" } ]

这样前端页面绑定Select2控件的时候,就使用了JSON对象的属性即可。

    //绑定Ajax的内容
    $.getJSON(url, function (data) {
        control.empty();//清空下拉框
        $.each(data, function (i, item) {
            control.append("<option value=‘" + item.Value + "‘>&nbsp;" + item.Text + "</option>");
        });
    });

控制器的实现代码如下:

        /// <summary>
        /// 根据字典类型获取对应的字典数据,方便UI控件的绑定
        /// </summary>
        /// <param name="dictTypeName">字典类型名称</param>
        /// <returns></returns>
        public ActionResult GetDictJson(string dictTypeName)
        {
            List<CListItem> treeList = new List<CListItem>();
            CListItem pNode = new CListItem("", "");
            treeList.Insert(0, pNode);

            Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName);
            foreach (string key in dict.Keys)
            {
                treeList.Add(new CListItem(key, dict[key]));
            }
            return ToJsonContent(treeList);
        }

3)树形列表的绑定操作

对于属性列表,如所属公司、所属部门机构等有层次性的数据,它的绑定操作也是类似的,如下代码所示。

            //绑定添加界面的公司、部门、直属经理
            BindSelect("Company_ID", "/User/GetMyCompanyDictJson?userId="[email protected]["UserId"]);
            $("#Company_ID").on("change", function (e) {
                var companyid = $("#Company_ID").val();
                BindSelect("Dept_ID", "/User/GetDeptDictJson?parentId="+ companyid);
            });
            $("#Dept_ID").on("change", function (e) {
                var deptid = $("#Dept_ID").val();
                BindSelect("PID", "/User/GetUserDictJson?deptId="+ deptid);
            });

只是它们返回的数据,我们把它作为有缩进的显示内容而已。

[ { "Text": "爱奇迪集团", "Value": "1" }, { "Text": " 广州分公司", "Value": "3" }, { "Text": " 上海分公司", "Value": "4" }, { "Text": " 北京分公司", "Value": "5" } ]

或者如下所示

[ { "Text": "广州分公司", "Value": "3" }, { "Text": "总经办", "Value": "6" }, { "Text": "财务部", "Value": "7" }, { "Text": "工程部", "Value": "8" }, { "Text": "产品研发部", "Value": "9" }, { "Text": "  开发一组", "Value": "14" }, { "Text": "  开发二组", "Value": "15" }, { "Text": "  测试组", "Value": "16" }, { "Text": "市场部", "Value": "10" }, { "Text": "  市场一部", "Value": "23" }, { "Text": "  市场二部", "Value": "24" }, { "Text": "综合部", "Value": "11" }, { "Text": "生产部", "Value": "12" }, { "Text": "人力资源部", "Value": "13" } ]

综上两个部分,我们可以看到它们的Text的内容,是根据层次关系进行空格增加,从而实现了层次关系的显示。

不过从这个界面效果上讲,这样的处理确实没有EasyUI里面,对下拉列表树的展示好看,也许可以利用更好的Bootstrap插件进行这个树形内容的展示。

  

4)select2控件的赋值处理

上面介绍的方法,都是介绍select2控件的初始化,绑定相关的数据,那么如果初始化界面后,我们绑定编辑界面的值的时候,就需要赋值给控件,让它显示真正需要显示的项目了。

如清空控件的方法如下所示。

            //清空Select2控件的值
            $("#PID").select2("val", "");
            $("#Company_ID").select2("val", "");
            $("#Dept_ID").select2("val", "");

如果对于多个控件,需要清除,则可以使用集合进行处理

            var select2Ctrl = ["Area","Industry","Grade","CustomerType","Source","CreditStatus","Stage","Status","Importance"];
            $.each(select2Ctrl, function (i, item) {
                var ctrl = $("#" + item);
                ctrl.select2("val", "");
            });

给Select2 控件赋值,让它显示对应值内容的项目,那么操作也就和上面的类似了。

                 $("#CustomerType").select2("val", info.CustomerType);
                 $("#Grade").select2("val", info.Grade);
                 $("#CreditStatus").select2("val", info.CreditStatus);
                 $("#Importance").select2("val", info.Importance);
                 $("#IsPublic").select2("val", info.IsPublic);

如果需要级联显示的,那么做法增加一个onchange的函数处理就可以了,如下级联代码的赋值处理如下。

                 $("#Province").select2("val", info.Province).trigger(‘change‘);//联动
                 $("#City").select2("val", info.City).trigger(‘change‘);//联动
                 $("#District").select2("val", info.District);
                $("#Company_ID1").select2("val", info.Company_ID).trigger(‘change‘);
                $("#Dept_ID1").select2("val", info.Dept_ID).trigger(‘change‘);
                $("#PID1").select2("val", info.PID);

多个列表项目数据的绑定。

我们从案例里面可以看到,Select2支持多项值的选择,它们保存后会以逗号分开,如果我们需要在编辑的时候显示存储的多个记录,那么需要把字符串转换为数组列表才能进行正确绑定,如下所示。

$("#Permission").select2("val", info.Permission.split(‘,‘));

最后来两个整体性的界面效果,供参考。

时间: 2024-08-08 01:29:46

在用到select2时,临时抱佛脚学习了一下的相关文章

斯坦福大学公开课机器学习:machine learning system design | data for machine learning(数据量很大时,学习算法表现比较好的原理)

下图为四种不同算法应用在不同大小数据量时的表现,可以看出,随着数据量的增大,算法的表现趋于接近.即不管多么糟糕的算法,数据量非常大的时候,算法表现也可以很好. 数据量很大时,学习算法表现比较好的原理: 使用比较大的训练集(意味着不可能过拟合),此时方差会比较低:此时,如果在逻辑回归或者线性回归模型中加入很多参数以及层数的话,则偏差会很低.综合起来,这会是一个很好的高性能的学习算法. 原文地址:https://www.cnblogs.com/chenwenyan/p/8326027.html

关于在学习python爬虫时的学习记录

最近学习python3爬虫,看的是这位博主的博客,不得不说,是真的厉害,通俗易懂^?_?^ 我要学习的还有很多-从基本的python知识,我就被难倒了- 哎,记录下我的盲点- 花了近一个钟头测试出来的结果. 在爬取相关的html时,text ≠ text[0] 后者是正确的.我一直以为不加的效果也是一样的结果,在我理解看来就是从头开始的,即从0到尾的所有相关的内容,实际上我的理解与相关的python基础不谋而和,可能是爬虫就需要如此的?我就默认好了- 在python中的方法后面的()是不可省去的

对公共语言运行时的学习笔记

图文讲解.NET CLR是什么 - 51CTO.COMhttp://developer.51cto.com/art/200910/158022.htm 通用语言运行时(CommonLanguageRuntiome,CLR)最早被称为下一代Windows服务运行时(NGWS Runtime).它是直接建立在操作系统上的一个虚拟环境,主要的任务是管理代码的运行.CLR现在支持几十种现代的编程语言为它编写代码,然后以一种中间语言(Intermediate Langeoage,IL)代码的形成被执行.并

21.微服务工具箱(运行时)学习:了解Micro、复习、列出所有服务

因为新版Micro工具已经弃用了consul,加入了etcd的支持,所以我们把服务注册放入到etcd中 package main import ( "github.com/micro/go-micro" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/registry/etcd" "micro/Services" "micro/Servi

C语言入门学习教程-1.搭建开发环境

学习一门好的编程语言,对于一个网络安全爱好者来说就如同手持一把利剑.而对于学习安全的人来说最好的编程语言一定是越贴近底层越好.所以,推荐大家学习C语言.为了方便大家学习,我就将我学习C语言时的学习笔记进行了整理,发到我的博客上http://2937605316.blog.51cto.com/.每日更新,欢迎订阅.(求赞,求转!:)),也欢迎想要学习网络安全的朋友加入我们"VirtualSec|虚拟安全"小组(如果,想要加入的可以联系我QQ:2937605316). 那么说了这么多,就开

Deep Learning(深度学习)学习笔记整理系列之(三)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主

翻出当年的学习进度汇报邮件——前路不易,且行且珍惜

离回归程序猿行列已经一年又一个月整了,也就是进入现在这家公司已经一年又一个月整.确实是个整数,清清楚楚的记得去年入职时间是3月27日,似乎冥冥中总有那么些凑巧的事情发生.现在的公司是一家创业型公司,接受过一轮风投,从创办至今,时间其实不算短.今年是公司非常关键的一年,总觉得年初至今的项目目标不够明确,甚至有点杂乱.作为一个开发人员兼中层管理,最近这段时间想的比较多.可能由于上个月拼死拼活做的项目因为找不到盈利模式被迫暂停的缘故,最近几个星期尤为浮躁,很难静下心来看书学习. 今天下午一时兴起开始整

Deep Learning(深度学习)学习笔记整理

申明:本文非笔者原创,原文转载自:http://www.sigvc.org/bbs/thread-2187-1-3.html 4.2.初级(浅层)特征表示 既然像素级的特征表示方法没有作用,那怎样的表示才有用呢? 1995 年前后,Bruno Olshausen和 David Field 两位学者任职 Cornell University,他们试图同时用生理学和计算机的手段,双管齐下,研究视觉问题. 他们收集了很多黑白风景照片,从这些照片中,提取出400个小碎片,每个照片碎片的尺寸均为 16x1

Deep Learning(深度学习)学习笔记整理系列(三)——Deep Learning的基本思想

[email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0  2013-04-08 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈