在ASP.NET MVC中使用Knockout实践09,自定义绑定
Knockout真正强大之处在于绑定机制,通过data-bind属性值体现绑定,不仅可以绑定值,还可以绑定事件,甚至可以自定义绑定。
从一个例子看Knockou的绑定机制
假设想给一个button元素变成jQuery UI的button,大致这样做:
<button id="btn">点我</button>$('#btn').button( icons: { primary: 'ui-icon-gear' } );
"他山之石,可以攻玉",实际上Knockout可以通过它的绑定机制来借用其它js类库实现相同的功能。如果能做到以下这样就好了:
<button data-bind="jqButton: { icons: { primary: 'ui-icon-gear' } }">点我</button>
如果我们想给Knockout增加自定义绑定,必须通过ko.bindingHandlers属性。
<button data-bind="click: sayHello, jqButton: { icons: { primary: 'ui-icon-gear' } }">点我</button>
@section scripts{<script src="~/Scripts/knockout-3.2.0.js"></script><script type="text/javascript">ko.bindingHandlers.jqButton = {init: function (element, valueAccessor) {var options = valueAccessor() || {};$(element).button(options);ko.utils.domNodeDisposal.addDisposeCallback(element, function () {$(element).button("destroy");});}};var vm = {sayHello: function () {alert("hello");}};ko.applyBindings(vm);</script>}
以上,通过ko.bindingHandlers,增加了一个名称为jqButton的绑定。

到这里,有必要了解一下Knockout的绑定机制了。
ko.bindingHandlers.myCustomBinding = {init: function(element, valueAccessor, allBindingsAccessor, data, context) {},update: function(element, valueAccessor, allBindingsAccessor, data, context) {}};
init函数只在元素第一次绑定的时候运行。通常用来给元素绑定一个handler。update函数只在View Model中,具有observable的成员值发生改变的时候被运行。
init和update包含5个参数:
○ element表示实施绑定的DOM元素
○ valueAccessor 表示传值给绑定机制的函数,该函数可能是View Model中具有Observable的成员,也有可能是json对象。
○ allBindingsAccessor 用来获取运用在同一DOM元素上的所有绑定
○ data 用来获取View Model
○ context绑定的上下文,包括$data, $parent, $parents, $root等属性
更新View Model的时候让DOM元素闪一下
绑定无非就是关乎View Model和Dom元素,现在,当View Model中具有Obserable的成员值反生变化的时候,让DOM元素闪一下(实际上就是让DOM元素先隐藏再慢慢显现)。根据绑定机制,肯定要自定义update函数。
@{ViewBag.Title = "Index";Layout = "~/Views/Shared/_Layout.cshtml";}<h2>Index</h2><style type="text/css">.main {background-color: #CCC;}</style><div class="main" data-bind="flash: name"><span data-bind="text: name"></span></div><hr/><input data-bind="value: name"/>@section scripts{<script src="~/Scripts/knockout-3.2.0.js"></script><script type="text/javascript">ko.bindingHandlers.flash = {update: function(element, valueAccessor) {ko.utils.unwrapObservable(valueAccessor());$(element).hide().fadeIn(500);}};var vm = {name: ko.observable("darren")};ko.applyBindings(vm);</script>}

每当input值发生变化,div区域总会闪一下。
给现有的绑定再套上一层绑定
比如说,Knockout已经有了一个名称为text的绑定,当View Model中具有Obserable的成员值发生改变,绑定text的DOM元素值也会随之发生变化。如果我们想让text值发生变化的时候闪动一下,该如何做呢?
<input data-bind="value: name"/><hr/><span data-bind="fadeText: name"></span>@section scripts{<script src="~/Scripts/knockout-3.2.0.js"></script><script type="text/javascript">ko.bindingHandlers.fadeText = {update: function(element, valueAccessor) {$(element).hide();ko.bindingHandlers.text.update(element, valueAccessor);$(element).fadeIn(500);}};var vm = {name: ko.observable("darren")};ko.applyBindings(vm);</script>}
以上,当input值发生变化的时候,span的值随之闪动并变化。
在ASP.NET MVC中使用Knockout实践09,自定义绑定的更多相关文章
- 在ASP.NET MVC中使用Knockout实践01,绑定Json对象
本篇体验在ASP.NET MVC下使用Knockout,将使用EF Code First创建数据库.最后让Knockout绑定一个Json对象. 创建一个领域模型. namespace MvcAppl ...
- 在ASP.NET MVC中使用Knockout实践07,自定义验证信息的位置与内容
在前两篇中,体验了Knockout的基本验证和自定义验证.本篇自定义验证信息的显示位置与内容. 自定义验证信息的显示位置 通常,Knockout的验证信息紧跟在input后面,通过validation ...
- 在ASP.NET MVC中使用Knockout实践06,自定义验证、异步验证
在上一篇中体验了Knockout.Validation的基本验证,本篇体验自定义验证和异步验证. 自定义验证规则 ko.validation有一个rules属性,专门用来存放验证规则,它是一个键值对集 ...
- 在ASP.NET MVC中使用Knockout实践08,使用foreach绑定集合
本篇体验使用 foreach 绑定一个Product集合. 首先使用构造创建一个View Model. var Product = function(data) { this.name = ko.ob ...
- 在ASP.NET MVC中使用Knockout实践05,基本验证
本篇体验View Model验证.Knockout的subscribe方法能为View Model成员注册验证规则. @{ ViewBag.Title = "Index"; Lay ...
- 在ASP.NET MVC中使用Knockout实践04,控制View Model的json格式内容
通常,需要把View Model转换成json格式传给服务端.但在很多情况下,View Model既会包含字段,还会包含方法,我们只希望把字段相关的键值对传给服务端. 先把上一篇的Product转换成 ...
- 在ASP.NET MVC中使用Knockout实践03,巧用data参数
使用Knockout,当通过构造函数创建View Model的时候,构造函数的参数个数很可能是不确定的,于是就有了这样的一个解决方案:向构造函数传递一个object类型的参数data. <inp ...
- 在ASP.NET MVC中使用Knockout实践02,组合View Model成员、Select绑定、通过构造器创建View Model,扩展View Model方法
本篇体验使用ko.computed(fn)计算.组合View Model成员.Select元素的绑定.使用构造器创建View Model.通过View Model的原型(Prototype)为View ...
- [摘]在ASP.NET MVC中使用DropDownList
在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便的办法还是使用HtmlHelper中的辅助方法.在View中,包含一个类型为HtmlHelper的属性H ...
随机推荐
- 从requests源码分析中学习python(一)
v2ex同步更新:https://www.v2ex.com/t/500081 微信公众号:python学习开发 分析源码,看大神的代码是一种学习的好方法,让我从中学到很多以前不知道的知识,这次打算从大 ...
- 使用Eclipse Memory Analyzer分析Tomcat内存溢出
前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...
- WebStrom配置node.js
Webstrom的注册码: WebStorm 7.0.1注册码 user name:newasp 注册码: ===== LICENSE BEGIN ===== 16417-12042010 00001 ...
- Java编程的逻辑 (71) - 显式锁
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- LINQ基本语句
一.什么是LINQ 1.定义:LINQ是Language Integrate Query的缩写,它在对象和数据之间建立一种对应关系,可以使用访问内存对象的方式查询数据集合. 2.特点:由于LINQ中查 ...
- C语言:指针实现输出梯形字符串
用指针实现,实现过程无需将子串复制到一个新的字符串中.(10分) 题目内容: 用指针实现,实现过程无需将子串复制到一个新的字符串中. 输入格式: 字符串 输出格式: 子串 输入样例: computer ...
- linux系统下创建lvm挂载到指定目录
1 .背景 在企业中有时我们为方便安装软件.数据的管理,需要把安装软件.数据放到固定目录下,磁盘满了方便扩展,这里假如需要一个/data目录存放数据,并单独进行挂载. 2.操作步骤 2.1 划分磁盘 ...
- JS开发打气球游戏
JS开发打气球游戏 观视频<月薪4万的程序员有多强?半小时原生JS开发打气球游戏,征服现场数万人!> 清晨,日常打开B站,被首页此视频的标题所吸引,虽一看就是标题党,但还是没能抑制住好奇心 ...
- Codeforces Round #480 (Div. 2) E - The Number Games
题目大意:给你n个点的一棵树, 每个点的权值为2^i ,让你删掉k个点使得剩下的权值和最大. 思路:这题还是比较好想的, 我们反过来考虑, 剩下一个的情况肯定是选第n个点,剩下两个 我们肯定优先考虑第 ...
- Storm目录树和任务提交过程
Storm组件本地目录树 Storm zookeeper目录树 Storm任务提交的过程