前言

你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像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(自定义绑定)相关推荐

  1. knockout之自定义绑定

    Creating custom bindings You're not limited to using the built-in bindings like click, value, and so ...

  2. Knockout.Js官网学习(创建自定义绑定)

    前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...

  3. knockout+html绑定,Knockout.Js官网学习(style绑定、attr绑定)

    Style绑定 style绑定是添加或删除一个或多个DOM元素上的style值.比如当数字变成负数时高亮显示,或者根据数字显示对应宽度的Bar.(注:如果你不是应用style值而是应用CSS clas ...

  4. 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 的目的是 ...

  5. Knockout.js 初探

    Knockout.js是什么? Knockout是一款很优秀的JavaScript库,它可以帮助你仅使用一个清晰整洁的底层数据模型(data model)即可创建一个富文本且具有良好的显示和编辑功能的 ...

  6. Knockout.js 整理

    上个月做项目需要用到easyui和Knockout.js ,所以简单的整理了下,以便学习 Knockout.js 是一个JavaScript库,它可以让HTML控件很容易与数据进行绑定.使用的是&qu ...

  7. Knockout.js入门

    Knockout.js 是一个JavaScript库,它可以让你声明绑定元素和其对应的数据模型,达到你的UI和模型自动双向更新.Knockout入门不难,并且它很好地集成了其他的类库和技术.通过本篇文 ...

  8. JQuery Ajax 与 Knockout.js的结合

    项目中遇到太多JQuery Ajax 与 Knockout.js的结合来处理数据的情况,今天将这部分内容梳理一下.一来弄清楚二者结合处理数据的流程,二来是感觉二者结合在一起用的时候有点将二者搞混了,弄 ...

  9. 【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 ...

最新文章

  1. Java图片,视频上传,截取视频帧以及文件下载和视频IO获取
  2. [凯立德]2014春季版3121J0H+3121D0H
  3. django2中关于时间处理策略
  4. XXX集团财务决策支持系统——财务分析指标(系列五)
  5. springBoot 登录拦截器
  6. 2010年亚运会前广州将大力推广清洁能源公交
  7. html并行加载,html – 浏览器中的最大并行HTTP连接数?
  8. 获取form表单_【第1535期】前端 Form 的表单的一个通用解决方案
  9. python对角线图_python对角线图_python – 在Seaborn Jointplot上绘制对角线(相等的线)...
  10. ssis导入xml_使用XML文件配置SSIS包
  11. 配置eclipse编写html/js/css/jsp/java时自动提示
  12. java junit 运行_运行Junit方法项目启动不了
  13. JSON服务器(json-server)
  14. 拉勾数据分析岗数据分析报告
  15. python办公自动化实例(四):批量生成CAD图纸
  16. 题解 P4480 【[BJWC2018]餐巾计划问题】
  17. Charles cannot configure your proxy settings while it is on a read-only volume
  18. java加密方案:Virbox Protector Java版-全新保护方案
  19. VMware故障:配置文件(.vmx)损坏修复
  20. react中列表渲染的局部刷新

热门文章

  1. ps_基础技术提升topic基础知识调研
  2. 剑指 offer代码解析——面试题39推断平衡二叉树
  3. Go语言栈定义及相关方法实现
  4. [JDBC] MySQL中数据的增查删改(二)
  5. Android特色开发之账户管理
  6. IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)
  7. 【收藏】ASP.NET英文技术文章推荐[10/28 – 11/3]
  8. 【Java例题】2.5 温度转换
  9. 洛谷P2888 [USACO07NOV]牛栏Cow Hurdles
  10. MongoDB(三):MongoDB概念解析