5.Knockout.Js(自定义绑定)
前言
你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等)。你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定。例如,你可以在form表单里自定义像grid,tabset等这样的绑定。
注册你的绑定
添加子属性到ko.bindingHandlers来注册你的绑定:
<script type="text/javascript">ko.bindingHandlers.yourBindName = {init: function (element, valueAccessor, allBindingsAccessor, viewModel){///绑定时,设置任何初始状态,事件处理程序 }, update: function (element,valueAccessor,allBindingsAccessor,viewModel) { ///绑定之后应用于dom元素上,然后观察dom元素的变化,进行相应调用更新 } }; </script>
然后就可以在任何DOM元素上使用了:
<div data-bind="yourBindingName: someValue"> </div>
你实际上没必要把init和update这两个callbacks都定义,你可以只定义其中的任意一个。
update回调
当管理的observable改变的时候,KO会调用你的update callback函数,然后传递以下参数:
element — 使用这个绑定的DOM元素
valueAccessor —JavaScript函数,通过valueAccessor()可以得到应用到这个绑定的model上的当前属性值。
allBindingsAccessor —JavaScript函数,通过allBindingsAccessor ()得到这个元素上所有model的属性值。
viewModel — 传递给ko.applyBindings使用的 view model参数,如果是模板内部的话,那这个参数就是传递给该模板的数据。
例如,你可能想通过 visible绑定来控制一个元素的可见性,但是你想让该元素在隐藏或者显示的时候加入动画效果。那你可以自定义自己的绑定来调用jQuery的slideUp/slideDown 函数:
ko.bindingHandlers.slidVisible = {update: function (element, valueAccessor, allBingingsAccessor, viewModel) {var value = valueAccessor(), allBindings = allBindingsAccessor();var valueUnwrapped = ko.utils.unwrapObservable(value);var duration = allBindings.slideDuration || 400; if (valueUnwrapped == true) { $(element).slideDown(duration); } else { $(element).slideUp(duration); } } };
然后你可以像这样使用你的绑定:
<div data-bind="slideVisible: giftWrap, slideDuration:600">You have selected the option</div> <label><input type="checkbox" data-bind="checked: giftWrap" /> Gift wrap</label>
左边是初始化的,右边是点击Check之后的 ,你也可以运行查看效果,消失和出现都是渐变的效果,这自定义的绑定还是不错的。
init回调
Knockout在DOM元素使用自定义绑定的时候会调用你的init函数。init有两个重要的用途:
1.为Dom元素设置初始值
2.注册事件句柄,例如当用户点击或者编辑Dom元素的时候,你可以改变相关的observable值的状态。
KO会传递和update回调函数一样的参数。
继续上面的例子,你可以像让slideVisible在页面第一次显示的时候设置该元素的状态(但是不使用任何动画效果),而只是让动画在以后改变的时候再执行。你可以这样来做:
ko.bindingHandlers.slideVisible = {init: function(element, valueAccessor) {var value = ko.utils.unwrapObservable(valueAccessor());$(element).toggle(value);},update: function (element, valueAccessor, allBingingsAccessor, viewModel) {var value = valueAccessor(), allBindings = allBingingsAccessor();var valueUnwrapped = ko.utils.unwrapObservable(value); var duration = allBindings.slideDuration || 400; if (valueUnwrapped == true) { $(element).slideDown(duration); } else { $(element).slideUp(duration); } } };
这就是说giftWrap的初始值声明的是false(例如giftWrap: ko.observable(false)),然后让初始值会让关联的DIV隐藏,之后用户点击checkbox的时候会让元素显示出来。
DOM事件之后更新observable值
你已经值得了如何使用update回调,当observable值改变的时候,你可以更新相关的DOM元素。但是其它形式的事件怎么做呢?比如当用户对某个DOM元素有某些action操作的时候,你想更新相关的observable值。
你可以使用init回调来注册一个事件句柄,这样可以改变相关的observable值,例如
ko.bindingHandlers.hasfocus = {init: function (element, valueAccessor) {$(element).focus(function () {var value = valueAccessor();});$(element).blur(function () {var value = valueAccessor();value(false); }); }, update: function (element, valueAccessor) { var value = valueAccessor(); if (ko.utils.unwrapObservable(value)) { element.focus(); } else { elemen.blur(); } } };
现在你可以通过hasFocus绑定来读取或者写入这个observable值了:
<h2>DOM事件之后更新observable值</h2> <p>Name: <input data-bind="hasFocus: editingName" /></p> <div data-bind="visible: editingName">You're editing the name</div> <button data-bind="enable: !editingName(), click:function() { editingName(true) }">Edit name</button>
当元素获得焦点和失去焦点
转载于:https://www.cnblogs.com/TF12138/p/4156927.html
5.Knockout.Js(自定义绑定)相关推荐
- knockout之自定义绑定
Creating custom bindings You're not limited to using the built-in bindings like click, value, and so ...
- Knockout.Js官网学习(创建自定义绑定)
前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...
- knockout+html绑定,Knockout.Js官网学习(style绑定、attr绑定)
Style绑定 style绑定是添加或删除一个或多个DOM元素上的style值.比如当数字变成负数时高亮显示,或者根据数字显示对应宽度的Bar.(注:如果你不是应用style值而是应用CSS clas ...
- MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录...
注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...
- Knockout.js 初探
Knockout.js是什么? Knockout是一款很优秀的JavaScript库,它可以帮助你仅使用一个清晰整洁的底层数据模型(data model)即可创建一个富文本且具有良好的显示和编辑功能的 ...
- Knockout.js 整理
上个月做项目需要用到easyui和Knockout.js ,所以简单的整理了下,以便学习 Knockout.js 是一个JavaScript库,它可以让HTML控件很容易与数据进行绑定.使用的是&qu ...
- Knockout.js入门
Knockout.js 是一个JavaScript库,它可以让你声明绑定元素和其对应的数据模型,达到你的UI和模型自动双向更新.Knockout入门不难,并且它很好地集成了其他的类库和技术.通过本篇文 ...
- JQuery Ajax 与 Knockout.js的结合
项目中遇到太多JQuery Ajax 与 Knockout.js的结合来处理数据的情况,今天将这部分内容梳理一下.一来弄清楚二者结合处理数据的流程,二来是感觉二者结合在一起用的时候有点将二者搞混了,弄 ...
- 【ASP.NET Web API教程】2.3.5 用Knockout.js创建动态UI
[ASP.NET Web API教程]2.3.5 用Knockout.js创建动态UI 原文:[ASP.NET Web API教程]2.3.5 用Knockout.js创建动态UI 注:本文是[ASP ...
最新文章
- Java图片,视频上传,截取视频帧以及文件下载和视频IO获取
- [凯立德]2014春季版3121J0H+3121D0H
- django2中关于时间处理策略
- XXX集团财务决策支持系统——财务分析指标(系列五)
- springBoot 登录拦截器
- 2010年亚运会前广州将大力推广清洁能源公交
- html并行加载,html – 浏览器中的最大并行HTTP连接数?
- 获取form表单_【第1535期】前端 Form 的表单的一个通用解决方案
- python对角线图_python对角线图_python – 在Seaborn Jointplot上绘制对角线(相等的线)...
- ssis导入xml_使用XML文件配置SSIS包
- 配置eclipse编写html/js/css/jsp/java时自动提示
- java junit 运行_运行Junit方法项目启动不了
- JSON服务器(json-server)
- 拉勾数据分析岗数据分析报告
- python办公自动化实例(四):批量生成CAD图纸
- 题解 P4480 【[BJWC2018]餐巾计划问题】
- Charles cannot configure your proxy settings while it is on a read-only volume
- java加密方案:Virbox Protector Java版-全新保护方案
- VMware故障:配置文件(.vmx)损坏修复
- react中列表渲染的局部刷新
热门文章
- ps_基础技术提升topic基础知识调研
- 剑指 offer代码解析——面试题39推断平衡二叉树
- Go语言栈定义及相关方法实现
- [JDBC] MySQL中数据的增查删改(二)
- Android特色开发之账户管理
- IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)
- 【收藏】ASP.NET英文技术文章推荐[10/28 – 11/3]
- 【Java例题】2.5 温度转换
- 洛谷P2888 [USACO07NOV]牛栏Cow Hurdles
- MongoDB(三):MongoDB概念解析