目的

options绑定主要用于下拉列表中(即<select>元素)或多选列表(例如,<select size='6'>)。此绑定不能与除<select>元素之外的任何其他元素一起使用。

其值应该是一个数组(或监控属性数组)。

注意:对于多选列表,设置该选项被选中,或读取其中被选中的选项,需要使用的selectedOptions绑定。对于单选择列表,可以结合value绑定读取和写入选定的选项的。。

示例1:下拉列表

Destination country:

源码:

  1. <p>
  2. Destination country:
  3. <select data-bind="options: availableCountries"></select>
  4. </p>
  5.  
  6. <script type="text/javascript">
  7. var viewModel = {
  8. // These are the initial options
  9. availableCountries: ko.observableArray(['France', 'Germany', 'Spain'])
  10. };
  11.  
  12. // ... then later ...
  13. viewModel.availableCountries.push('China'); // Adds another option
  14. </script>

示例2:多选列表

Choose some countries you would like to visit:

源码:

  1. <p>
  2. Choose some countries you would like to visit:
  3. <select data-bind="options: availableCountries" size="5" multiple="true"></select>
  4. </p>
  5.  
  6. <script type="text/javascript">
  7. var viewModel = {
  8. availableCountries: ko.observableArray(['France', 'Germany', 'Spain'])
  9. };
  10. </script>

示例3:任意JS对象的下拉列表

Your country:

You have chosen a country with population .

源码:

  1. <p>
  2. Your country:
  3. <select data-bind="options: availableCountries,
  4. optionsText: 'countryName',
  5. value: selectedCountry,
  6. optionsCaption: 'Choose...'"></select>
  7. </p>
  8.  
  9. <div data-bind="visible: selectedCountry"> <!-- Appears when you select something -->
  10. You have chosen a country with population
  11. <span data-bind="text: selectedCountry() ? selectedCountry().countryPopulation : 'unknown'"></span>.
  12. </div>
  13.  
  14. <script type="text/javascript">
  15. // Constructor for an object with two properties
  16. var Country = function(name, population) {
  17. this.countryName = name;
  18. this.countryPopulation = population;
  19. };
  20.  
  21. var viewModel = {
  22. availableCountries : ko.observableArray([
  23. new Country("UK", 65000000),
  24. new Country("USA", 320000000),
  25. new Country("Sweden", 29000000)
  26. ]),
  27. selectedCountry : ko.observable() // Nothing selected by default
  28. };
  29. </script>

示例4:任意JS对象的下拉列表并以计算的方式显示文本

源码:

  1. <!-- Same as example 3, except the <select> box expressed as follows: -->
  2. <select data-bind="options: availableCountries,
  3. optionsText: function(item) {
  4. return item.countryName + ' (pop: ' + item.countryPopulation + ')'
  5. },
  6. value: selectedCountry,
  7. optionsCaption: 'Choose...'">
  8. </select>

备注,示例4与示例3的唯一区别在于optionsText的显示方式。

参数

  • optionsCaption

    有时候,你可能不希望默认选择选中任何特定选项。但单选择下拉列表中通常选择一些默认项目启动,因此,如何避免预选的东西,通常的解决方法是用一个特殊的虚拟选项,只是写着“选择项”或“请选择一个选项”或类似的东西,并具有在默认情况下选择了一个前缀的选项列表。

    这很容易做到:只需添加额外的参数有名字optionsCaption,它的值是显示一个字符串。例如:

    <select data-bind='options: myOptions, optionsCaption: "Select an item...", value: myChosenValue'></select>

    KO会前缀一个显示文本的项目列表“选择项目...”它的值是undefined。因此,如果myChosenValue保持值undefined,则虚设选项将被选中。如果optionsCaption参数是监控属性,则初始项目的文本将根据监控属性值的变化而变化。

  • optionsText

    见上面的示例3,在这种情况下,你需要选择该对象的属性应显示为下拉列表或多选列表的文本。示例3显示了如何可以通过传递一个额外的参数指定属性名optionsText

    如果你不希望下拉列表中的每个项目显示的只是一个简单的属性值的文本,你可以给optionsText选项传递一个JavaScript函数,并提供您自己任意的逻辑在表示对象的条件计算显示的文本。如示例4。

  • optionsValue

    类似optionsText,您还可以传递一个名为optionsValue的附加参数,以指定应使用哪些对象属性来设置KO生成的<option>元素上的value属性。 您还可以指定JavaScript函数来确定此值。 此函数将接收所选项作为其唯一参数,并应返回用于<option>元素的value属性的字符串。

    通常,您只想使用optionsValue作为一种确保KO在更新可用选项集时正确保留选择的方法。 例如,如果您通过Ajax调用重复获取“car”对象的列表,并且想要确保所选择的汽车被保留,您可能需要将optionsValue设置为“carId”或每个“car”对象具有的唯一标识符 ,否则KO不一定知道先前的“汽车”对象中的哪一个对应于新集合中的项目。

  • optionsIncludeDestroyed

    有时你可能想将一个数组条目标记为已删除,但实际上没有真的删除。 这被称为非破坏性删除。

    默认情况下,选项绑定将跳过(即隐藏)标记为已销毁的任何数组条目。 如果要显示已销毁的条目,请指定此附加参数,例如:

    <select data-bind='options: myOptions, optionsIncludeDestroyed: true'></select>

  • optionsAfterRender

    如果需要在生成的选项元素上运行一些自定义逻辑,可以使用optionsAfterRender回调。 见下文注2。

  • selectedOptions

    对于多选列表,可以使用selectedOptions读取和写入所选状态。 技术上这是一个单独的绑定,你可以参考下一节的selectedOptions绑定。

  • valueAllowUnset

    如果你想让Knockout允许你的模型属性获取在你的<select>元素没有相应条目的值(并通过使<select>元素为空,显示这个值),然后参见第四章 value绑定的valueAllowUnset

备注1:设置/更改选项时保留选择

当选项绑定更改您的<select>元素中的选项集时,KO将尽可能不改变用户的选择。 因此,对于单选择下拉列表,仍将选择先前选择的选项值,而对于多选列表,仍将选择所有先前选择的选项值(除非您已删除 一个或多个选项)。

这是因为选项绑定试图独立于值绑定(控制单选列表的选择)和selectedOptions绑定(控制多选列表的选择)。

备注2:对生成的选项进行处理

如果需要在生成的选项元素上运行一些自定义逻辑,可以使用optionsAfterRender回调。 每当将一个选项元素插入到列表中时,将调用回调函数,并使用以下参数:

  1. 插入的option元素

  2. 与其绑定的数据项,或对于caption元素未定义的数据项

下面是一个使用optionsAfterRender向每个选项添加禁用绑定的示例:

源码:

  1. <select size=3 data-bind="
  2. options: myItems,
  3. optionsText: 'name',
  4. optionsValue: 'id',
  5. optionsAfterRender: setOptionDisable">
  6. </select>
  7.  
  8. <script type="text/javascript">
  9. var vm = {
  10. myItems: [
  11. { name: 'Item 1', id: 1, disable: ko.observable(false)},
  12. { name: 'Item 3', id: 3, disable: ko.observable(true)},
  13. { name: 'Item 4', id: 4, disable: ko.observable(false)}
  14. ],
  15. setOptionDisable: function(option, item) {
  16. ko.applyBindingsToNode(option, {disable: item.disable}, item);
  17. }
  18. };
  19. ko.applyBindings(vm);
  20. </script>

KnockoutJS 3.X API 第四章 表单绑定(11) options绑定的更多相关文章

  1. KnockoutJS 3.X API 第四章 表单绑定(9) value绑定

    目的 value绑定主要用于DOM元素给视图模型赋值用的.通常用于<input><select><textarea>等元素. value绑定与text绑定的区别在于 ...

  2. KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定

    textInput绑定目的 textInput绑定主要用于<input>或者<textarea>元素.他提供了DOM和viewmodel的双向更新.不同于value绑定,tex ...

  3. KnockoutJS 3.X API 第四章 表单绑定(6) click绑定

    目的 click绑定主要作用是用于DOM元素被点击时调用相关JS函数.最常见用于button.input.a元素. 例如: You've clicked timesClick me var viewM ...

  4. KnockoutJS 3.X API 第四章 表单绑定(7) event绑定

    目的 event绑定即为事件绑定,即当触发相关DOM事件的时候回调函数.例如keypress,mouseover或者mouseout等 例如: Mouse over me Details var vi ...

  5. KnockoutJS 3.X API 第四章 表单绑定(8) submit、enable、disable绑定

    submit绑定目的 submit绑定即为提交绑定,通常用于form元素.这种绑定方式会打断默认的提交至服务器的操作.转而提交到你设定好的提交绑定回调函数中.如果要打破这个默认规则,只需要在回调函数中 ...

  6. KnockoutJS 3.X API 第四章 表单绑定(12) selectedOptions、uniqueName绑定

    selectedOptions绑定目的 selectedOptions绑定控制当前选择多选列表中的哪些元素. 这旨在与<select>元素和选项绑定结合使用. 当用户选择或取消选择多选列表 ...

  7. KnockoutJS 3.X API 第四章 数据绑定(1) 文本及样式绑定

    目录 本节将介绍六种文本绑定方式: visible绑定 text绑定 html绑定 css绑定 style绑定 attr绑定 可见文本绑定(visible) 使用visible绑定,来控制DOM元素的 ...

  8. KnockoutJS 3.X API 第四章(13) template绑定

    目的 template绑定(模板绑定)使用渲染模板的结果填充关联的DOM元素. 模板是一种简单方便的方式来构建复杂的UI结构 . 下面介绍两种使用模板绑定的方法: 本地模板是支持foreach,if, ...

  9. JavaScript高级程序设计学习笔记第十四章--表单

    1.在 HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是 HTMLFormElement 类型. HTMLFormElement 继承了 HT ...

随机推荐

  1. 视图合并、hash join连接列数据分布不均匀引发的惨案

    表大小 SQL> select count(*) from agent.TB_AGENT_INFO; COUNT(*) ---------- 1751 SQL> select count( ...

  2. oracle官方文档12c对应关系

    ADDCI Oracle® Database Data Cartridge Developer's Guide 12c Release 1 (12.1) E15882-05 ADFNS Oracle® ...

  3. maven 搜索不到想从本地仓库依赖的jar包--重建本地maven仓库索引

    问题:有时候本地仓库有相关的jar包,但是在pom.xml中利用工具搜索不到 菜单栏设置显示Maven Respositorise视图:Windows--Show View--Other..   (对 ...

  4. 用js写的比较简单3D旋转效果

    HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. pushState 和 replaceState

    使用此方法浏览器前进后退仍然可查看对应内容 设置值 history.pushState({}, "页面标题", "xxx.html"); history.rep ...

  6. :尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。 ---> System.BadImageFormatException: 试图加载格式不正确的程序。

    iis有程序池有一个属性  是否启用32位应用程序默认是true的特别注意windows2008 服务器系统iis默认的是true 这样发布一下也是必须要做的

  7. Android学习地址

    Google Android官方培训课程中文版http://hukai.me/android-training-course-in-chinese/

  8. Linux环境下解压超过4GB的zip文件

    今天在Linux服务器中解压一个zip的压缩包,提示如下错误信息: [root@appsrv01 ZIP_BCSA_COURSES]# unzip BCSA_MEDIAS_BAK_20161118.z ...

  9. 【设计模式之单例模式InJava】

    1. 单例模式 1.1饿汉式(开发常用) class SingleFirst { /* 添加其他成员信息 */ private static SingleFirst s1 = new SingleFi ...

  10. .net 调用php webservice报错404状态解决方法

    添加引用的地址和实例的地址不一致 在程序中将实例的地址重新赋值即可 例子: test t=new test(); t.url=http://www.sdf.com/sdfdsf.php?wsdl