data-bind绑定语法

Knockout的声明性绑定系统提供了一种简洁而强大的方法来将数据链接到UI。 绑定到简单的数据属性或使用单个绑定通常是容易和明显的。 对于更复杂的绑定,它有助于更好地了解Knockout的绑定系统的行为和语法。

绑定语法

绑定包含两个项目,绑定名称和值,用冒号分隔。 这里是一个单一的简单绑定的示例:

Today's message is: <span data-bind="text: myMessage"></span>

元素可以包括多个绑定(相关或不相关),每个绑定由逗号分隔。 这里有些例子:

<!-- related bindings: valueUpdate is a parameter for value -->
Your value: <input data-bind="value: someValue, valueUpdate: 'afterkeydown'" /> <!-- unrelated bindings -->
Cellphone: <input data-bind="value: cellphoneNumber, enable: hasCellphone" />

绑定名称通常应与注册的绑定处理程序(内置或自定义)匹配,或者是另一绑定的参数。 如果名称不匹配,Knockout将忽略它(没有任何错误或警告)。 因此,如果绑定看起来不工作,首先检查名称是否正确。

绑定值

绑定值可以是单个值,变量或字面值或几乎任何有效的JavaScript表达式。 下面是各种绑定值的示例:

<!-- variable (usually a property of the current view model -->
<div data-bind="visible: shouldShowMessage">...</div> <!-- comparison and conditional -->
The item is <span data-bind="text: price() > 50 ? 'expensive' : 'cheap'"></span>. <!-- function call and comparison -->
<button data-bind="enable: parseAreaCode(cellphoneNumber()) != '555'">...</button> <!-- function expression -->
<div data-bind="click: function (data) { myFunction('param1', data) }">...</div> <!-- object literal (with unquoted and quoted property names) -->
<div data-bind="with: {emotion: 'happy', 'facial-expression': 'smile'}">...</div>

这些示例显示该值可以只是关于任何JavaScript表达式。 即使逗号和括号括在大括号,括号或括号中。 当值是对象字面值时,对象的属性名称必须是有效的JavaScript标识符或用引号括起来。 如果绑定值是无效表达式或引用未知变量,Knockout将输出错误并停止处理绑定。

带空格的绑定写法

绑定可以包含任意数量的空格(空格,制表符和换行符),因此您可以随意使用它来根据需要排列绑定。 以下示例均等效:

<!-- no spaces -->
<select data-bind="options:availableCountries,optionsText:'countryName',value:selectedCountry,optionsCaption:'Choose...'"></select> <!-- some spaces -->
<select data-bind="options : availableCountries, optionsText : 'countryName', value : selectedCountry, optionsCaption : 'Choose...'"></select> <!-- spaces and newlines -->
<select data-bind="
options: availableCountries,
optionsText: 'countryName',
value: selectedCountry,
optionsCaption: 'Choose...'"></select>

无值绑定

从Knockout 3.0开始,您可以指定没有值的绑定,这将给绑定一个未定义的值。 例如:

<span data-bind="text">Text that will be cleared when bindings are applied.</span>

当与绑定预处理配合使用时,此功能特别有用,可以为绑定分配默认值。

绑定上下文

绑定上下文是保存您可以从绑定引用的数据的对象。 在应用绑定时,Knockout自动创建和管理绑定上下文的层次结构。 层次结构的根级别是指您提供给ko.applyBindings(viewModel)的viewModel参数。 然后,每次使用控制流绑定(如with或foreach)时,都会创建引用嵌套视图模型数据的子绑定上下文。

绑定上下文提供以下特殊属性,您可以在任何绑定中引用:

  • $parent

    这是父上下文中的视图模型对象,即紧接在当前上下文之外的视图模型对象。 在根上下文中,这是未定义的。 例:

    <h1 data-bind="text: name"></h1>
    
    <div data-bind="with: manager">
    
    <!-- Now we're inside a nested binding context -->
    
    <span data-bind="text: name"></span> is the
    
    manager of <span data-bind="text: $parent.name"></span>
    
    </div>
  • $parents

    这是一个表示所有父视图模型的数组:

    $ parents [0]是来自父上下文的视图模型(即,它与$ parent相同)

    $ parents [1]是祖父上下文的视图模型

    $ parents [2]是祖父的祖父母上下文的视图模型

    … and so on.

  • $root

    这是根上下文中的主视图模型对象,即最顶层父上下文。 它通常是传递给ko.applyBindings的对象。 它等价于$ parents [$ parents.length - 1]。

  • $component(未来章节详细介绍)

    如果你在特定组件模板的上下文中,那么$ component引用该组件的viewmodel。 它是特定于组件的等价于$ root。 在嵌套组件的情况下,$ component指的是最近组件的viewmodel。

    这是有用的,例如,如果组件的模板包含一个或多个foreach块,其中您希望引用组件视图模型上的某些属性或函数,而不是当前数据项。

  • $data

    这是当前上下文中的视图模型对象。 在根上下文中,$ data和$ root是等效的。 在嵌套绑定上下文中,此参数将设置为当前数据项(例如,在with:person绑定内,$ data将设置为person)。 $ data在你想引用viewmodel本身时很有用,而不是viewmodel上的一个属性。 例:

    <ul data-bind="foreach: ['cats', 'dogs', 'fish']">
    
    <li>The value is <span data-bind="text: $data"></span></li>
    
    </ul>
  • $index (仅在foreach绑定中可用)

    这是由foreach绑定呈现的当前数组条目的从零开始的索引。 与其他绑定上下文属性不同,$ index是一个observable,并且只要项目的索引发生更改(例如,如果项目添加到数组或从数组中删除),就会更新。

  • $parentContext

    这指的是父级别的绑定上下文对象。 这与$ parent不同,$ parent指的是父级别的数据(非绑定上下文)。 例如,如果您需要从内部上下文(用法:$ parentContext。$ index)访问外部foreach项的索引值,这是有用的。 在根上下文中未定义。

  • $rawData

    这是当前上下文中的原始视图模型值。 通常这将与$ data相同,但是如果提供给Knockout的视图模型包装在一个observable中,那么$ data将是展开的视图模型,$ rawData将是observable本身。

  • $componentTemplateNodes

    如果你在特定组件模板的上下文中,那么$ componentTemplateNodes是一个包含传递给该组件的任何DOM节点的数组。 这使得容易构建接收模板的组件,例如接受模板以定义其输出行的网格组件。 有关完整的示例,未来章节讲详细介绍。

以下特殊变量也可在绑定中使用,但不是绑定上下文对象的一部分:

  • $context

    这指的是当前绑定上下文对象。 如果要访问上下文的属性(如果它们也可能存在于视图模型中),或者如果要将上下文对象传递到视图模型中的辅助函数,则这可能很有用。

  • $element

    这是元素DOM对象(对于虚拟元素,它将是注释DOM对象)当前绑定。 如果绑定需要访问当前元素的属性,这可能很有用。 例:

    <div id="item1" data-bind="text: $element.id"></div>

控制或修改自定义绑定中的绑定上下文

就像使用foreach的内置绑定一样,自定义绑定可以更改其后代元素的绑定上下文,或通过扩展绑定上下文对象来提供特殊属性。 这将在创建控制后代绑定的自定义绑定章节中进行详细描述。

章节结语

在以后章节中,将会介绍到KnockoutJS3.X的高级应用,尽请期待,感谢阅读。支持的话请点一波关注和推荐。谢谢

KnockoutJS 3.X API 第四章(14) 绑定语法细节的更多相关文章

  1. KnockoutJS 3.X API 第四章 表单绑定(11) options绑定

    目的 options绑定主要用于下拉列表中(即<select>元素)或多选列表(例如,<select size='6'>).此绑定不能与除<select>元素之外的 ...

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

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

  3. KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定

    本节目录: 一个例子 API 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, w ...

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

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

  5. KnockoutJS 3.X API 第四章 数据绑定(2) 控制流foreach绑定

    foreach绑定 foreach绑定主要用于循环展示监控数组属性中的每一个元素,一般用于table标签中 假设你有一个监控属性数组,每当您添加,删除或重新排序数组项时,绑定将有效地更新UI的DOM- ...

  6. KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定

    if绑定目的 if绑定一般是格式是data-bind=if:attribute,if后所跟属性或表达式的值应为bool值(也可以是非bool值,当非空字符串时则为真),if绑定的作用与visible绑 ...

  7. KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定

    with绑定的目的 使用with绑定的格式为data-bind="with:attribute",使用with绑定会将其后所跟的属性看作一个新的上下文进行绑定.with绑定内部的所 ...

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

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

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

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

随机推荐

  1. Openlayers+Geoserver(一):项目介绍以及地图加载

           项目验收完,趁着事情不是很多,对这个项目进行梳理.我主要负责地图模块,网站其他模块主要有两个,一个是报表,主要是100多张报表,技术没有难度,主要是工作量的问题.另一个是数据的校验,就是 ...

  2. Reset CSS

    摘自<锋利的JQuery> 关于重置样式,可以参考Eric meyer的重置样式和YUI的重置样式 body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt ...

  3. Android开机启动Activity或者Service方法

    本文出自 “Bill_Hoo专栏” 博客,请务必保留此出处http://billhoo.blog.51cto.com/2337751/761230 这段时间在做Android的基础开发,现在有一需求是 ...

  4. C#中调用python方法

    最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...

  5. 04、AngularJS的ng-bind、多个控制器和apply

    这篇,讲一下angularjs的ng-bind指令,多个控制器,以及手动触发angularjs的脏检查,我直接把代码贴,顺着代码讲. <!DOCTYPE html> <html> ...

  6. XAF 官方问题笔记

    1.How to print report direct, and print preview via an simple action? 如何通过一个按钮直接打印报表或者打印预览报表 https:/ ...

  7. java基础4_字符串

    一 字符串 Java字符串关键字是String,是一个类,创建新的字符串即创建一个新的对象. 1.字符串的声明及初始化. String str; //只做声明 String str1="aa ...

  8. I am Nexus Master!(虽然只是个模拟题。。。但仍想了很久!)

    I am Nexus Master!  The 13th Zhejiang University Programming Contest 参见:http://www.bnuoj.com/bnuoj/p ...

  9. Linux磁盘管理

    本系列的博客来自于:http://www.92csz.com/study/linux/ 在此,感谢原作者提供的入门知识 这个系列的博客的目的在于将比较常用的liunx命令从作者的文章中摘录下来,供自己 ...

  10. ASP.NET 4.5.256 has not been registered on the Web server. You need to manually configure your Web server for ASP.NET 4.5.256 in order for your site to run correctly

    Microsoft .NET Framework 4.6安装后,用户可能会在使用Microsoft Visual Studio 创建(或打开现有项目时)网站.或Windows Azure项目时遇到下面 ...