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 相关文章推荐
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
Apr 12 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
May 13 Javascript
javascript与cookie 的问题详解
Nov 11 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
May 29 Javascript
JavaScript验证电子邮箱的函数
Aug 22 Javascript
基于jQuery实现的QQ表情插件
Aug 25 Javascript
Canvas 制作动态进度加载水球详解及实例代码
Dec 09 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
Jul 15 Javascript
基于JavaScript实现一个简单的Vue
Sep 26 Javascript
layui layer select 选择被遮挡的解决方法
Sep 21 Javascript
js正则匹配多个全部数据问题
Dec 20 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的FTP学习(一)[转自奥索]
2006/10/09 PHP
php实现的在线人员函数库
2008/04/09 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
php+ajax实现文章自动保存的方法
2014/12/30 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
Python入门篇之函数
2014/10/20 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
基于python实现模拟数据结构模型
2020/06/12 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
佳能法国商店:Canon法国
2019/02/14 全球购物
高考备战决心书
2014/03/11 职场文书
房地产推广策划方案
2014/05/19 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
MySQL系列之十二 备份与恢复
2021/07/02 MySQL
修改并编译golang源码的操作步骤
2021/07/25 Golang