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 相关文章推荐
js 纯数字不重复排列的另类方法
Jul 17 Javascript
关于include标签导致js路径找不到的问题分析及解决
Jul 09 Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 Javascript
jQuery的事件预绑定
Dec 05 Javascript
微信公众号 摇一摇周边功能开发
Dec 08 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Dec 15 Javascript
JavaScript实现图片瀑布流和底部刷新
Jan 02 Javascript
Web开发使用Angular实现用户密码强度判别的方法
Sep 27 Javascript
使用Vue实现移动端左滑删除效果附源码
May 16 Javascript
JavaScript代码简化技巧实例解析
Sep 09 Javascript
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
Axios取消重复请求的方法实例详解
Jun 15 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
杏林同学录(八)
2006/10/09 PHP
PHP实现下载功能的代码
2012/09/29 PHP
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
layer ui插件显示tips时,修改字体颜色的实现方法
2019/09/11 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
解密Python中的描述符(descriptor)
2015/06/03 Python
Python入门必须知道的11个知识点
2018/03/21 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
Python中利用aiohttp制作异步爬虫及简单应用
2018/11/29 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
初任培训自我鉴定
2013/10/07 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
村委会主任先进事迹
2014/01/15 职场文书
机械工程师岗位职责
2014/06/16 职场文书
物业消防安全责任书
2014/07/23 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
关于教师节的广播稿
2014/09/10 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Go timer如何调度
2021/06/09 Golang
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript