3 天学习 knockout - 第 2 天






4.24/5 (9投票s)
今天我们将深入研究 knockout,
在我上一篇文章中,我为您提供了带有简单示例的knockout.js框架的概述。
正如我所说,knockout框架帮助我们创建具有完整业务逻辑验证和简洁语法的交互式UI。今天我们将看到它是如何做到的。让我们潜入knockout的海洋,游泳并尝试在池塘(knockout)中寻找新的鱼(功能):)
注意:Knockout.js库附带其智能感知功能,这是开发人员最喜欢的部分。如果您想了解更多关于knockout的信息,请尝试查看智能感知。
在阅读本文之前,请先阅读第一天的文章。
第 1 天
议程
1)可观察类型
- 可观察数组
- 可观察数组的演示示例
- 依赖可观察对象
- 依赖可观察对象的演示示例
2)内置绑定和自定义绑定
- 与文本和外观相关的绑定
- 与表单元素和事件相关的绑定
- 控制流绑定
- 模板
让我们开始我们的实验。在阅读本文时,请同时尝试。我也附上了演示示例解决方案。
Observables (可观察对象)
可观察数组
正如我们在第一天所见,我们创建了可观察属性,它帮助我们跟踪属性的变化,我们称之为依赖跟踪。同样,对于集合中的依赖跟踪,我们有 **observableArray**。它可以声明为
当我提到集合时,肯定会有一些内置函数会立即出现。我将只解释observableArray的重要函数。
我设计了一个包含一些按钮和一个div来显示记录列表的网页。
向列表中添加项目
push() - observable array的此方法用于向集合中添加项目。
addclick: function () { var self = this; self.list.push({EmpNo: self.list().length + 1, FirstName: "Pradeep", LastName: "Shet" }) }
正如您所见,为了识别项目,我添加了EmpNo属性,这是一个递增的数字。
从列表中删除项目
pop() –此方法用于从列表中删除最后插入的项目。
deleteclick: function () { this.list.pop(); }
反转列表
reverse() -此方法反转列表项。
reverseclick: function () { this.list.reverse(); }
从列表中删除所有项目
removeAll() –此方法帮助我们从列表中删除所有项目。
removeallclick: function () { this.list.removeAll(); }
排序
sort() - 现在使用knockout observables array排序变得非常简单。Knockout为我们提供了使用sort方法对observable array进行排序的功能。此方法接受两个参数进行比较,即 - 假设a和b为参数,则当a==b时sort返回0,当a<b时返回<0,当a>b时返回>0。
sortclick: function (sortdirection) { this.list.sort( function (left, right) { if (sortdirection == 'asc') return left.EmpNo < right.EmpNo ? -1 : (left.EmpNo > right.EmpNo); else return left.EmpNo > right.EmpNo ? -1 : (left.EmpNo < right.EmpNo); });
在这里,我根据Employee No.(一个递增值)进行排序。请参考**ObersvableArray.aspx**页面。
到目前为止,请忽略它如何在<li>标签中显示列表。我们将在下面的部分介绍这个主题。
依赖可观察对象
注意:在knockout 2.0之后重命名为computed,Dependent Observable是一种封装一个或多个observable的对象。
viewModel.TotalEmployees = ko.computed(function () { var self = this; return (self.list().length > 0) ? "Total Employees: " + self.list().length : ""; }, viewModel);
在上一个代码片段中,我们将创建一个计算列来显示总员工数。ko.computed(fn,vm)接受2个参数。
1)返回依赖于其他observable的值的函数
2)代表**this**关键字的视图模型名称。
数据绑定。
内置绑定主要有四种类型。我们在我们创建的演示应用程序中已经使用了一些。
- 文本和外观相关的绑定
请参阅Default.aspx页面。- text - 自从我向您展示第一个演示以来,我们一直在使用它。我们已经用它在标签中显示Employee Name。
<span data-bind="text: FirstName"></span>
- html - 它会附加DOM元素的原始HTML。
<span data-bind="html: htmlContent"></span>
- style - 根据条件应用DOM元素的样式。
<span data-bind="style: color:(FirstName().length > 2 : 'red' : 'blue')"></span>
正如您所看到的,根据条件,我为span设置了颜色。 - css - 要应用CSS类,我们可以使用此绑定。
-
<span data-bind="html: htmlContent, css: {clsHighlight : FirstName().length > 1}"></span>
- 注意:1)要应用多个CSS,您可以在花括号内用逗号分隔。在这里,只有当我的名字长度大于1时,我才应用了cssclass clsHighlight。
2) 如果您想应用任何不是合法JavaScript名称的CSS,请将该名称写在单引号中。
<span data-bind="css: ‘cls-Highlight’ : isDisplay}"></span>
这里cls-Highlight不是一个正确的CSS名称,但我们可以给出这种名称。在这种情况下,如所示,将其写在单引号中。 - visible - 如果我们要使DOM元素可见或不可见,则此功能非常有用。
<span data-bind="visible: fullAddressVisible"></span>
- text - 自从我向您展示第一个演示以来,我们一直在使用它。我们已经用它在标签中显示Employee Name。
- 与表单相关的绑定****
请参阅Default.aspx页面。- click - 添加事件处理程序。
<input type="button" value="PUSH" data-bind="click:pushclick" />
- event - 此绑定帮助我们添加多个事件,如下所示。
<input type="button" value="PUSH" data-bind="event: { focus: enableDetails, blur: disableDetails }" />
- enable/disable - 此绑定用于启用/禁用DOM元素。
- selectedOptions - 当从下拉列表或列表框中选择项目时,可以使用此绑定。
options - 用于绑定下拉列表或列表框的列表。
两者都接受一个数组作为输入。<select data-bind="options: ['India','Canada','Singapore'], selectedOptions: ['Canada']"></select>
- value - 此绑定可用于设置DOM元素的值。
<input type="text" name="txtFname" data-bind="value: FirstName" />
- textInput - 这与value类似,并且适用于文本框和文本区域。但与value唯一的区别是它在键入文本框/文本区域时会立即更新模型。
- click - 添加事件处理程序。
- 控制流绑定
请参阅Default.aspx页面。- if - 基于条件的绑定。
<div data-bind="if: (FirstName().length > 0)>
在这里,我试图检查如果名字可用,才显示此>div<,否则将其保持不可见。 - ifnot - 相同的基于条件的绑定,但检查否定。
- foreach - 遍历集合。
<ul data-bind="foreach: list">
在这里,**list**是一个可迭代的observable array。 - with - with绑定创建一个新的绑定上下文,以便后代元素在指定对象的上下文中进行绑定。假设我有一个包含FirstName、LastName、LeavesDate属性的Employees列表,其中Leaves又是LeavesDate的集合。在这种情况下,如果我想遍历Employee的Leaves集合并访问其LeavesDate,那么我们将使用**with**,它创建一个子绑定上下文并引用嵌套的视图模型数据。在视图模型中,我将添加另一个名为**Contacts**的属性。其中我将有tel、mob、fax这3个属性和一些值。现在我可以在span中像这样绑定这些值。
<div> <b> Contact Nos</b> <br /> Tel:<span data-bind="text: Contacts.tel"></span> <br /> Mobile:<span data-bind="text: Contacts.mob"></span> <br /> Fax:<span data-bind="text: Contacts.fax"></span> </div>
另一种方式,我们可以通过使用**with**来移动我的绑定光标或上下文到后代元素,如下所示。<div data-bind="with: Contacts"> <b> Contact Nos</b> <br /> Tel:<span data-bind="text: tel"></span> <br /> Mobile:<span data-bind="text: mob"></span> <br /> Fax:<span data-bind="text: fax"></span> </div>
这使得我的代码简洁易懂:)
- if - 基于条件的绑定。
- 模板绑定
请参阅TemplateBinding.aspx页面。
- template - 脚本<script>标签内的绑定。
假设我们要绑定集合中的一些信息。因此,在容器(即<ul>)中迭代信息时,我可以在类型为text/html的script标签内保留通用的绑定信息。下面的代码向您展示了我如何映射模板ID和脚本标签ID,以及knockout如何通过相同的绑定上下文进行迭代。这是遍历集合的一种方式。 -
<ul data-bind="template{name: 'listtemplate', foreach: list}"> </ul> <script id="listtemplate" type="text/html"> <li data-bind="text: FirstName + ' ' + LastName + ' ' + SelectedCountry"></li> </script>
- 无容器控制流 - 使用注释进行绑定
这是knockout提供的一种奇怪但很好的遍历集合的技术。这里只需将代码从script标签移到容器<ul>中。
正如您所看到的,使用**ko foreach: list**我能够遍历集合。还要关闭**/ko**。这个**ko**解释了**list**对象的绑定上下文。
要记住的一点:这种基于注释的编码适用于任何绑定。例如:if、ifnot等。 -
<ul> <!--ko foreach: list--> <li data-bind="text: FirstName + ' ' + LastName + ' ' + SelectedCountry"></li> <!--/ko--> </ul>
- template - 脚本<script>标签内的绑定。
到目前为止,我们已经涵盖了observable的类型和knockout中可用的内置绑定类型。您难道不认为这使我们的工作比以前编写Web应用程序时简单得多吗?
现在让我们来了解如何创建自己的绑定。
自定义绑定
如果找不到满足要求的绑定,我们可以创建自己的绑定。这可以通过扩展knockout的bindingHandler来完成。
创建自定义绑定的步骤
- Ko.bindingHandlers.MyBindingName = { }
- 在此绑定中设置两个对象属性:
init – init函数在第一次评估绑定时运行。我的意思是当它被用于绑定DOM时。
update – 只要observable值或绑定值发生更改,就会随后调用update函数。
创建一个custombinding.js文件。
/// <reference path="Scripts/jquery-1.11.1.min.js"/> /// <reference path="Scripts/knockout.js"/> ko.bindingHandlers.MyCustomColor = { init: function (element, valueAccessor, allBindingAccessor, viewModel) { var color = valueAccessor(); $(element).css('background-color', 'blue'); }, update: function (element, valueAccessor, allBindingAccessor, viewModel) { var color = valueAccessor(); var binding = allBindingAccessor().KeepTextBold; $(element).css({ 'background-color': color(), 'border': '1px', 'border-style': 'solid' }); if (binding()) $(element).css({ 'font-weight': 'bold' }); else $(element).css({ 'font-weight': 'normal' }); } };
在CustomBinding.aspx中,
Enter Color: <input type="textbox" data-bind="value: setcolor" /> <br /> Bold Text: <input type="checkbox" data-bind="checked: bold" /> <div style="width:300px;height:200px" data-bind="MyCustomColor: setcolor, KeepTextBold: bold"> This is a Custom Binding Example </div> <script type="text/javascript"> $(function () { var viewModel = { bold: ko.observable(true) , setcolor: ko.observable('yellow') } ko.applyBindings(viewModel); }); </script>
让我们尝试理解上面的代码。
我创建了一个名为MyCustomColor的自定义绑定。在init()中,我将div的默认背景色设置为蓝色。在update()中,我从绑定到某个observable的文本框中访问值,该值与我的自定义绑定器中的div绑定。因此,在文本框中键入颜色时,该颜色会反映在我的div中。同样,另一个绑定KeepTextBold也在此自定义绑定器中访问,并根据附加到复选框的observable设置文本粗体属性。
输出:
这就是您可以创建自己的自定义绑定的方法。
到这里,我结束了我的第二天文章。今天我们学习了关于knockout的许多新知识,以及它如何使我们的工作变得容易。我希望现在您能够使用基本的CRUD操作创建自己的网页。
在接下来的文章中,我们将涵盖:
- 查找与DOM元素关联的数据
- 绑定上下文的类型
- JSON数据与ViewModel绑定
- 使用WebAPI进行CRUD操作
结论
这就是knockout如何提供新的绑定,使我们的代码更小、更简洁。我们过去常说jquery有助于缩短代码量与javascript相比。但现在您可以说,与jquery相比,knockout凭借其强大的绑定概念使代码更加简洁。请分享您的评论,无论是好是坏。
有关WCF(Windows Communication Foundation)、MVC(Model View Controller)、商业智能、设计模式、WPF、TFS等各种技术培训和基础知识,请访问www.JustCompile.com。