在上一篇《Knockoutjs属性绑定(Bindings)之控制文本和外观(Controlling text and appearance)》我们介绍了怎么样为View层的组件绑定对应的属性,这篇文章我们接着介绍Knockoutjs的属性绑定,这次我们主要介绍的是怎么样通过Knockoutjs来控制组件的流程显示(比如循环、判断是否显示等)。
一、foreach binding
使用此功能可以方便我们循环遍历输出某个数组、集合中的内容。
(1)、循环遍历输出数组
<script type="text/javascript" src="knockout-2.2.0.js"></script> <table> <thead> <tr><th>First name</th><th>Last name</th></tr> </thead> <tbody data-bind="foreach: people"> <tr> <td data-bind="text: firstName"></td> <td data-bind="text: lastName"></td> </tr> </tbody> </table> <script type="text/javascript"> ko.applyBindings({ people: [ { firstName: 'Bert', lastName: 'Bertington' }, { firstName: 'Charles', lastName: 'Charlesforth' }, { firstName: 'Denise', lastName: 'Dentiste' } ] }); </script>
(2)、动态增加和删除遍历节点
<script type="text/javascript" src="knockout-2.2.0.js"></script> <h4>People</h4> <ul data-bind="foreach: people"> <li> Name at position <span data-bind="text: $index"> </span>: <span data-bind="text: name"> </span> <a href="#" data-bind="click: $parent.removePerson">Remove</a> </li> </ul> <button data-bind="click: addPerson">Add</button> <script type="text/javascript"> function AppViewModel() { var self = this; self.people = ko.observableArray([ { name: 'Bert' }, { name: 'Charles' }, { name: 'Denise' } ]); self.addPerson = function () { self.people.push({ name: "New at " + new Date() }); }; self.removePerson = function () { self.people.remove(this); } } ko.applyBindings(new AppViewModel()); </script>
(3)、如果我们想要输出数组中的所有元素而不是像例一中使用firstName去指定元素的话,我们可以使用$data来进行输出。比如:
<script type="text/javascript" src="knockout-2.2.0.js"></script> <ul data-bind="foreach: months"> <li> The current item is: <b data-bind="text: $data"></b> </li> </ul> <script type="text/javascript"> ko.applyBindings({ months: ['Jan', 'Feb', 'Mar', 'etc'] }); </script>
当然,我们也可以使用$data来调用数组中具体的元素,比如我们要使用$data调用例1中的firstName的话,我们可以使用$data.firstName来输出firstName。
(4)、使用$index、$parent等其他的上下文属性
我们曾在例2中使用了$index来表示我们数组的下标,$index是Knockoutjs为我们提供的属性,我们可以直接引用,它会随着数组等下标的变化动态变化的,比如如果数组的长度减少了1,$index的值也会跟着减少的。
我们也可以使用$parent来使用foreach元素之外的属性,比如:
<h1 data-bind="text: blogPostTitle"></h1> <ul data-bind="foreach: likes"> <li> <b data-bind="text: name"></b> likes the blog post <b data-bind="text: $parent.blogPostTitle"></b> </li> </ul>
这里使用$parent来调用foreach循环体之外的blogPostTitle属性。
(5)、使用"as"为foreach中的元素定义别名
我们可以使用$data来代替数组中的元素,同时我们也可以使用as来为我们要遍历的元素起一个别名。
<script type="text/javascript" src="knockout-2.2.0.js"></script> <ul data-bind="foreach: { data: categories, as: 'category' }"> <li> <ul data-bind="foreach: { data: items, as: 'item' }"> <li> <span data-bind="text: category.name"></span>: <span data-bind="text: item"></span> </li> </ul> </li> </ul> <script> var viewModel = { categories: ko.observableArray([ { name: 'Fruit', items: ['Apple', 'Orange', 'Banana'] }, { name: 'Vegetables', items: ['Celery', 'Corn', 'Spinach'] } ]) }; ko.applyBindings(viewModel); </script>
在使用的时候我们要注意,起别名使用的是as:'category'而不是as:category。
(6)、在没有绑定属性的情况下使用foreach
有的时候我们想要循环输出一些特殊的内容,比如我们想要输入下面文本中的<li></li>标签:
<ul> <li class="header">Header item</li> <!-- The following are generated dynamically from an array --> <li>Item A</li> <li>Item B</li> <li>Item C</li> </ul>
如果我们想要循环输出上面代码中的<li></li>标签的话,我们就没有一个可以绑定foreach的元素,此时我们可以通过以下的代码来实现:
<script type="text/javascript" src="knockout-2.2.0.js"></script> <ul> <li class="header">Header item</li> <!-- ko foreach: myItems --> <li>Item <span data-bind="text: $data"></span></li> <!-- /ko --> </ul> <script type="text/javascript"> ko.applyBindings({ myItems: ['A', 'B', 'C'] }); </script>
我们使用<!--ko--><!--/ko-->来表示循环的开始和结束,这是一个虚拟的标签,Knockoutjs能够对其中的foreach进行绑定就好像你将foreach绑定到了一个真实的标签上一样。
(7)、默认不显示被标示为删除的元素
有的时候我们要跳过数组中的一些元素,此时这些元素已经被标示为删除,但并没有被真实删除,这些元素当我们使用foreach输出的时候是默认不显示的,如果我们想要这些元素显示的话,我们可以使用includeDestroyed
这个选项,比如:
<div data-bind='foreach: { data: myArray, includeDestroyed: true }'> ... </div>
二、if binding 和 if not binding
(1)、使用if binding可以控制某个组件动态显示,类似我们之前接触到的visible属性,不过此属性绑定过以后就不能更改,而if binding可以根据相应的条件控制组件是否显示,下面是一个简单的例子:
<script type="text/javascript" src="knockout-2.2.0.js"></script> <label><input type="checkbox" data-bind="checked: displayMessage" /> Display message</label> <div data-bind="if: displayMessage">Here is a message. Astonishing.</div> <script type="text/javascript"> ko.applyBindings({ displayMessage: ko.observable(false) }); </script>
此例根据checkbox是否勾选来控制是否显示下面的一个<div>。
我们也可以使用if来判断某个元素是否为null,如果为null则不会显示,如下:
<script type="text/javascript" src="knockout-2.2.0.js"></script> <ul data-bind="foreach: planets"> <li> Planet: <b data-bind="text: name"> </b> <div data-bind="if: capital"> Capital: <b data-bind="text: capital.cityName"> </b> </div> </li> </ul> <script> ko.applyBindings({ planets: [ { name: 'Mercury', capital: null }, { name: 'Earth', capital: { cityName: 'Barnsley'} } ] }); </script>
此例中如果capital为null,则不会进行显示。此时,如果没有if进行判断的话,则在使用capital.cityName时就会出错。
(2)、if not binding的使用方法和if binding的使用方法一样,这里就不作介绍了。
三、with binding
我们可以使用with binding来重新定义一个上下文绑定,比如:
<script type="text/javascript" src="knockout-2.2.0.js"></script> <h1 data-bind="text: city"> </h1> <p data-bind="with: coords"> Latitude: <span data-bind="text: latitude"> </span>, Longitude: <span data-bind="text: longitude"> </span> </p> <script type="text/javascript"> ko.applyBindings({ city: "London", coords: { latitude: 51.5001524, longitude: -0.1262362 } }); </script>
这样我们在使用coords下的latitude和longitude的时候我们就不需要使用coords.latitude来调用了,因为我们使用with:coords来指定了coords的上下文,当我们使用coords下面的属性时就可以直接使用了。
下面提供一个动态交互的例子:
<script type="text/javascript" src="knockout-2.2.0.js"></script> <form data-bind="submit: getTweets"> Twitter account: <input data-bind="value: twitterName" /> <button type="submit">Get tweets</button> </form> <div data-bind="with: resultData"> <h3>Recent tweets fetched at <span data-bind="text: retrievalDate"> </span></h3> <ol data-bind="foreach: topTweets"> <li data-bind="text: text"></li> </ol> <button data-bind="click: $parent.clearResults">Clear tweets</button> </div> <script type="text/javascript"> function AppViewModel() { var self = this; self.twitterName = ko.observable('@StephenFry'); self.resultData = ko.observable(); // No initial value self.getTweets = function () { twitterApi.getTweetsForUser(self.twitterName(), function (data) { self.resultData({ retrievalDate: new Date(), topTweets: data.slice(0, 5) }); }); } self.clearResults = function () { self.resultData(undefined); } } ko.applyBindings(new AppViewModel()); </script>
以上就是流程控制的全部内容。
相关推荐
2. 无值属性绑定:适用于需要使用`with`上下文绑定的属性,通常用于对象类型的属性。当使用`with`绑定时,可以指定一个对象,该对象中的属性将在`with`上下文中被绑定。例如: ```javascript $(function(){ var ...
**KnockoutJS**,简称KO.js,是一个轻量级的JavaScript库,专注于MVVM(Model-View-ViewModel)设计模式,使得在Web开发中实现数据绑定和动态用户界面变得简单易行。它通过双向数据绑定特性,允许开发者在视图和模型...
全能 jQuery Sparkline 的 KnockoutJS 自定义绑定 依赖 没有凉亭。 项目与 Bower 重生。 扩展选项 TODO:这些可以通过将对象传递给绑定器而不是使用单独的绑定来以更友好的 KnockoutJS 代码样式处理。 时间窗口...
计算属性是在KnockoutJS中定义的函数,它们可以依赖于其他属性并自动更新。这些属性不需要手动管理,因为Knockout会跟踪依赖关系并进行必要的计算。 ### 可观察对象(Observables) 可观察对象是KnockoutJS的核心...
**KnockoutJS** 是一个轻量级的MVVM(Model-View-ViewModel)JavaScript库,主要用于构建富交互的Web应用程序。它通过数据绑定和依赖跟踪机制,使得开发者能够更轻松地管理DOM(Document Object Model)与应用程序...
KnockoutJS的核心功能是双向数据绑定,它可以自动同步HTML元素与JavaScript对象的属性。这意味着当JavaScript对象的属性改变时,对应的视图元素也会实时更新,反之亦然。这大大减少了手动操作DOM的需要,提高了性能...
数据绑定是KnockoutJS的主要功能,它允许开发者声明性地将UI元素与JavaScript对象的属性关联起来。KnockoutJS支持多种类型的绑定,如文本绑定、HTML绑定、事件绑定、条件绑定、循环绑定等,使得UI的更新自动化,...
在 KnockoutJS 中,foreach 绑定后面跟的是要循环的监控属性数组名称,而 foreach 内部则可以引用数组项目中的具体属性。例如,在遍历人员列表时,可以使用 firstName 和 lastName 这样的属性来显示每个人的信息。 ...
这里,我们使用了 `options` 绑定来填充下拉列表,`value` 绑定来跟踪当前选中的值,`visible` 绑定则根据上级选择的值来控制下级列表的显示和隐藏。 在用户选择省份时,我们需要监听 `selectedProvince` 的变化,...
textInput绑定目的 textInput绑定主要用于<input>或者<textarea>元素。他提供了DOM和viewmodel的双向更新。不同于value绑定,textinput绑定是实时更新的。 例如: 源码: <p>Login name: <input ...
[Packt Publishing] KnockoutJS 入门教程 (英文版) [Packt Publishing] KnockoutJS Starter (E-Book) ☆ 出版信息:☆ [作者信息] Eric M. Barnard [出版机构] Packt Publishing [出版日期] 2012年11月23日 ...
KnockoutJS is a Model View ViewModel (MVVM) framework that allows you to simplify the design of complex user. Knockout makes data manipulation simple and leads to maintainable web applications. ...
该插件能够将JSON对象直接映射成KnockoutJS的observable数组和observable属性,极大地简化了数据到视图模型的转换过程。 最后,在HTML中,博主通过@Html.Raw和Newtonsoft.Json.JsonConvert.SerializeObject方法将从...
KnockoutJS 3.X API是一个介绍KnockoutJS库中API使用的指南,而其第四章则专注于数据控制流,其中特别介绍了if绑定和ifnot绑定这两种强大的数据绑定技术。 if绑定允许开发者根据一个条件表达式的结果来决定是否在...
这种模式与传统的多页面Web应用程序(Multi-Page Application,MPA)不同,它只加载初始页面,之后所有操作都通过JavaScript控制,不再需要从服务器加载新的页面,从而实现了更为流畅的用户体验。 在介绍单页面程序...
knockoutjs,前台MVVM模式实现框架。knockoutjs能使前台数据源与html页面分离开来,让程序员专注于数据的变化。详情请参照knockoutjs.com。本文件于2012-7-31下载于knockout官方网站,版本号2.1.0
例如,你可以使用`data-bind`属性将`<span>`元素绑定到数据模型中的特定属性,这样当属性值改变时,`<span>`的内容也会自动更新。 3. **可扩展性**: KnockoutJS允许开发者轻松创建自定义绑定,这使得你可以扩展库...
使用`enable`绑定根据`myItems`数组的长度来控制按钮的启用或禁用状态。 KnockoutJS的这种数据驱动的开发方式并不与jQuery或其他DOM操作库冲突,而是与它们互补。虽然它本身不依赖jQuery,但你可以同时使用jQuery来...
1. **数据绑定**:KnockoutJS的核心在于其强大的数据绑定功能,允许开发者将DOM元素与JavaScript对象的数据属性直接关联。源码中会展示如何使用`text`, `html`, `value`, `if`, `foreach`等不同的数据绑定指令来动态...