Knockout.js随手记(4)

动态绑定下拉列表

   在<select> data-bind的options选项如果绑定到ko.observableArray(),就可以动态新增选项效果,也就是可以利用其完成常见的级联效果的。

在这一篇文章中,我们用单页面完成无刷新的前台新增选项和使用MVC完成后台的动态添加2个例子。

范例一:

ViewModel中声明一个selectOptions属性为一个ko.observableArray()对象,并将其设为<select>的options下拉列表的数据源,再用两个<input>分別输入入Text及Value,输入內容点击新增按钮,此時就可看到下拉列表出現新增的选项內容。

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

  <title>动态新增下拉列表选项</title>

    <script src="Scripts/jquery-2.0.3.js"></script>

    <script src="Scripts/knockout-2.3.0.js"></script>

   <script type="text/javascript">

       //创建一个View对象

       function ViewModel() {

           var self = this;

           //使用observableArray进行绑定可以动态变更option选项

           self.selectOptions = ko.observableArray([

                { "text": "请选择", "value": "0" }

           ]);

           self.result = ko.observable("0");//添加result监控属性,初始绑定值为0

       }



       $(function () {

           var vm = new ViewModel();

           ko.applyBindings(vm);

           $("#btnAddItem").click(function () {

               vm.selectOptions.push({

                   "text": $("#txtOptText").val(),

                   "value": $("#txtOptValue").val()

               });

           });

       });

   </script>

    </head>

<body>

    <div style=" background-color:#0094ff; width:180px; margin:100px auto auto auto;">

        <select style="background-color:ActiveCaption;width:100px" data-bind="options: selectOptions, optionsText: 'text', optionsValue: 'value', value: result"></select>Value=<span data-bind="    text: result"></span>

        <div> Text: <input id="txtOptText" value="选项1"/></div>

        <div>Value: <input id="txtOptValue" value="1" /></div>

        <input type="button" value="新增选项" id='btnAddItem' />

 </div>

</body>

</html>

运行效果如下:

Knockout.js随手记(4)

范例二:Mvc结合knockout.js完成级联下拉菜单 

本例只是为了模拟,所以数据比较简陋,当然也可以从数据库中出数据来进行处理。

@{

    Layout = null;

}



<!DOCTYPE html>



<html>

<head>

    <meta name="viewport" content="width=device-width" />

    <title>Index</title>

    <script src="~/Scripts/jquery-2.0.3.js"></script>

    <script src="~/Scripts/knockout-2.3.0.debug.js"></script>



    </head>

    <body>

      <p>

        <b style="color:#0094ff">选择学生:</b> @Html.DropDownList("Student", ViewBag.Students  as SelectList, "请选择", new { onchange = "searchLover();" })

     </p>

      <p data-bind="visible: selectOptions().length > 0">

      <b style="color:#0094ff">喜爱的事物:</b>

      <select data-bind="options: selectOptions, optionsText: 'Name', optionsValue: 'Value', optionsCaption: '请选择'">

      </select>

</p>

    </body>

    <script type="text/javascript">

        function ViewModel() {

            this.selectOptions = ko.observableArray([]);

        }

        var vm = new ViewModel();

        ko.applyBindings(vm);

        function searchLover() {

            var id= $("#Student").val();

            $.getJSON(

                   "@Url.Action("GetLovers")",

                    { studentId: id},

                    function (data) {

                        vm.selectOptions(data);

            });

        }

</script>

</html>

-------------------------------------Controller中的数据模拟代码------------------------------------

using System.Collections.Generic;

using System.Web.Mvc;



namespace KnockFunctionDemo.Controllers

{

    public class HomeController : Controller

    {

        public ViewResult Index()

        {

            ViewBag.Students = new SelectList(GetStudentList(),"Id","Name");

            return View();

        }

        private static List<Student> GetStudentList()

        {

            return new List<Student>

            {

                new Student{ Id=001, Name="halower"},

                 new Student{ Id=002, Name="rohelm"}

            };

        }

        public JsonResult GetLovers(int studentId)

        {

            var list = new List<Lover>();

            if (studentId == null)

                list= null;

            else if (studentId == 001)

            {

                list.Add(new Lover { Name = "编程", Value = "program" });

                list.Add(new Lover { Name = "女朋友", Value = "GF" });

            }

            else

            {

                list.Add(new Lover { Name = "旅游", Value = "travel" });

                list.Add(new Lover { Name = "家庭", Value = "family" });

            }

            return  Json(list, JsonRequestBehavior.AllowGet);

        }

        

    }



   

    public class Student

    {

        public int Id { get; set; }

        public string Name { get; set; }

    }



    public class Lover

    {

        public string Value { get; set; }

        public string Name { get; set; }

    }

}

运行效果:

 Knockout.js随手记(4)

 

备注:

    本文版权归大家共用,不归本人所有,所有知识都来自于官网支持,书本,国内外论坛,大牛分享等等......后续将学习knockout.js的常用功能。

 

 

你可能感兴趣的:(knockout)