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 相关文章推荐
input的focus方法使用
Mar 13 Javascript
jquery click([data],fn)使用方法实例介绍
Jul 08 Javascript
深入解析JavaScript中的立即执行函数
May 21 Javascript
javaScript给元素添加多个class的简单实现
Jul 20 Javascript
AngularJS基础 ng-mouseover 指令简单示例
Aug 02 Javascript
原生JS实现图片轮播与淡入效果的简单实例
Aug 21 Javascript
js监听input输入框值的实时变化实例
Jan 26 Javascript
javascript观察者模式实现自动刷新效果
Sep 05 Javascript
jQuery常见的遍历DOM操作详解
Sep 05 jQuery
jQuery动态生成的元素绑定事件操作实例分析
May 04 jQuery
详解微信小程序的不同函数调用的几种方法
May 08 Javascript
Vue3.0数据响应式原理详解
Oct 09 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在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
php5 mysql分页实例代码
2008/04/10 PHP
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
Javascript 遍历对象中的子对象
2009/07/03 Javascript
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
JavaScript lodash常见用法系列小结
2016/08/24 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
python使用tornado实现登录和登出
2018/07/28 Python
在vscode中配置python环境过程解析
2019/09/28 Python
Python selenium的基本使用方法分析
2019/12/21 Python
最小二乘法及其python实现详解
2020/02/24 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
商场经理竞聘演讲稿
2014/01/01 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
MySQL数据库 安全管理
2022/05/06 MySQL