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常用技巧收集整理篇
Nov 14 Javascript
前台js改变Session的值(用ajax实现)
Dec 28 Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 Javascript
js完美的div拖拽实例代码
Jan 22 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
Aug 21 Javascript
node.js回调函数之阻塞调用与非阻塞调用
Nov 13 Javascript
跟我学习javascript的call(),apply(),bind()与回调
Nov 16 Javascript
PHP捕捉异常中断的方法
Oct 24 Javascript
jQuery Password Validation密码验证
Dec 30 Javascript
vue插槽slot的理解和使用方法
Apr 03 Javascript
vue自定义指令directive的使用方法
Apr 07 Javascript
p5.js实现简单货车运动动画
Oct 23 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
php 各种应用乱码问题的解决方法
2010/05/09 PHP
php数组编码转换示例详解
2014/03/11 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
Laravel下生成验证码的类
2017/11/15 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
js轮播图无缝滚动效果
2017/06/17 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python实现多行注释的另类方法
2014/08/22 Python
python套接字流重定向实例汇总
2016/03/03 Python
python实现下载文件的三种方法
2017/02/09 Python
python写一个md5解密器示例
2018/02/23 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
详解python中的Turtle函数库
2018/11/19 Python
详解Python:面向对象编程
2019/04/10 Python
Pytorch的mean和std调查实例
2020/01/02 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
浅析NumPy 切片和索引
2020/09/02 Python
abstract是什么意思
2012/02/12 面试题
啦啦队口号大全
2014/06/16 职场文书
老公出轨后的保证书
2015/05/08 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
python实现监听键盘
2021/04/26 Python