Knockout自定义绑定创建方法


Posted in Javascript onDecember 26, 2015

概述

除了上一篇列出的KO内置的绑定类型(如value、text等),你也可以创建自定义绑定。

注册你的binding handler

ko.bindingHandlers.yourBindingName = {
  init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
    // This will be called when the binding is first applied to an element
    // Set up any initial state, event handlers, etc. here
  },
  update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
    // This will be called once when the binding is first applied to an element,
    // and again whenever any observables/computeds that are accessed change
    // Update the DOM element based on the supplied values here.
  }
};

接下来你就可以在任意dom元素上使用的自定义绑定了:

<div data-bind="yourBindingName: someValue"> </div>

注意:你不必在你的handler里把init和update的callback都提供,可以提供任意一个。

update callback

顾名思义,当你的监控属性observable更新的时候,ko会自动调用你的update回调。

它有以下参数:

    element:使用这个绑定的dom元素;

    valueAccessor  : 通过调用valueAccessor()可以获得当前绑定的model属性值,调用ko.unwrap(valueAccessor())能够更方便的获取observable的值和普通值;

    allBindings : 绑定到这个dom元素上的model的所有属性值,例如调用callBindings.get('name') 返回绑定的name属性值(不存在返回undefined),或者调用allBindings.has('name')判断name是否绑定到了当前的dom中;

    viewModel  : 在Knockout.3x中以弃用,可用bindingContext.$data或者bindingContext.$rawData来获取当前的viewModel;

   bindingContext  : 绑定上下文,可调用bindingContext.$data、 bindingContext.$parent, bindingContext.$parents等获取数据;

接下来看一个例子,你也许希望使用visible绑定来控制元素的可见性,并且加上动画效果,这时你可以创建你的自定义绑定:

ko.bindingHandlers.slideVisible = {
  update: function(element, valueAccessor, allBindings) {
    // First get the latest data that we're bound to
    var value = valueAccessor();
    // Next, whether or not the supplied model property is observable, get its current value
    var valueUnwrapped = ko.unwrap(value);
    // Grab some more data from another binding property
    var duration = allBindings.get('slideDuration') || 400; // 400ms is default duration unless otherwise specified
    // Now manipulate the DOM element
    if (valueUnwrapped == true)
      $(element).slideDown(duration); // Make the element visible
    else
      $(element).slideUp(duration);  // Make the element invisible
  }
};

然后你可以这样使用这个自定义绑定:

<div data-bind="slideVisible: giftWrap, slideDuration:600">You have selected the option</div>
<label><input type="checkbox" data-bind="checked: giftWrap" /> Gift wrap</label>
<script type="text/javascript">
  var viewModel = {
    giftWrap: ko.observable(true)
  };
  ko.applyBindings(viewModel);
</script>

init callback

ko将为每个使用绑定的dom元素调用你的init函数,它有两个主要用途:

(1)为dom元素设置初始化状态;

(2)注册一些事件处理程序,例如:当用户点击或者修改dom元素时,你可以改变监控属性的状态;

ko将使用和update回调完全相同一组参数。

继续前面的例子,你也许想让slideVisible在页面第一次显示的时候就设置该元素的可见性状态(没有任何动画效果),而动画效果是在以后改变的时候执行,你可以按照下面的方式来做:

ko.bindingHandlers.slideVisible = {
  init: function(element, valueAccessor) {
    var value = ko.unwrap(valueAccessor()); // Get the current value of the current property we're bound to
    $(element).toggle(value); // jQuery will hide/show the element depending on whether "value" or true or false
  },
  update: function(element, valueAccessor, allBindings) {
    // Leave as before
  }
};

giftWrap被初始化定义为false(ko.observable(false)),关联的DIV会在初始化的时候隐藏,之后用户点击checkbox时才让DIV显示。

你现在已经知道如何使用update回调了,当observable值改变的时候你可以更新dom元素。我们现在可以用另外的方法来做,比如当用户有某个action操作时,也能引起你的observable值更新,例如:

ko.bindingHandlers.hasFocus = {
  init: function(element, valueAccessor) {
    $(element).focus(function() {
      var value = valueAccessor();
      value(true);
    });
    $(element).blur(function() {
      var value = valueAccessor();
      value(false);
    });
  },
  update: function(element, valueAccessor) {
    var value = valueAccessor();
    if (ko.unwrap(value))
      element.focus();
    else
      element.blur();
  }
};

现在你可以通过元素的“focusedness”绑定来读写你的observable值了。

<p>Name: <input data-bind="hasFocus: editingName" /></p>
<!-- Showing that we can both read and write the focus state -->
<div data-bind="visible: editingName">You're editing the name</div>
<button data-bind="enable: !editingName(), click:function() { editingName(true) }">Edit name</button>
<script type="text/javascript">
  var viewModel = {
    editingName: ko.observable()
  };
  ko.applyBindings(viewModel);
</script>

以上内容是小编给大家分享的Knockout自定义绑定创建方法,希望大家喜欢。

Javascript 相关文章推荐
jquery重复提交请求的原因浅析
May 23 Javascript
javascript实现切换td中的值
Dec 05 Javascript
JavaScript计时器示例分析
Feb 05 Javascript
js数组依据下标删除元素
Apr 14 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
Jan 26 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
Jun 03 Javascript
微信小程序 用户数据解密详细介绍
Jan 09 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
Oct 20 Javascript
Redux实现组合计数器的示例代码
Jul 04 Javascript
js操作table中tr的顺序实现上移下移一行的效果
Nov 22 Javascript
layui 中select下拉change事件失效的解决方法
Sep 20 Javascript
vue项目出现页面空白的解决方案
Oct 31 Javascript
JavaScript动态设置div的样式的方法
Dec 26 #Javascript
JS插件overlib用法实例详解
Dec 26 #Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
Dec 26 #Javascript
认识Knockout及如何使用Knockout绑定上下文
Dec 25 #Javascript
详解Document.Cookie
Dec 25 #Javascript
不得不分享的JavaScript常用方法函数集(下)
Dec 25 #Javascript
JQuery datepicker 用法详解
Dec 25 #Javascript
You might like
56.com视频采集接口程序(PHP)
2007/09/22 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
PHP eval函数使用介绍
2013/12/08 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
node内置调试方法总结
2018/02/22 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
python基础教程项目三之万能的XML
2018/04/02 Python
python中的字符串内部换行方法
2018/07/19 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
大学生应聘自荐信
2013/10/11 职场文书
化验室岗位职责
2015/02/14 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书