概述

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

注册你的binding handler

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

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

  1. <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绑定来控制元素的可见性,并且加上动画效果,这时你可以创建你的自定义绑定:

  1. ko.bindingHandlers.slideVisible = {
  2. update: function(element, valueAccessor, allBindings) {
  3. // First get the latest data that we're bound to
  4. var value = valueAccessor();
  5.  
  6. // Next, whether or not the supplied model property is observable, get its current value
  7. var valueUnwrapped = ko.unwrap(value);
  8.  
  9. // Grab some more data from another binding property
  10. var duration = allBindings.get('slideDuration') || 400; // 400ms is default duration unless otherwise specified
  11.  
  12. // Now manipulate the DOM element
  13. if (valueUnwrapped == true)
  14. $(element).slideDown(duration); // Make the element visible
  15. else
  16. $(element).slideUp(duration); // Make the element invisible
  17. }
  18. };

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

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

init callback

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

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

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

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

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

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

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

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

  1. ko.bindingHandlers.hasFocus = {
  2. init: function(element, valueAccessor) {
  3. $(element).focus(function() {
  4. var value = valueAccessor();
  5. value(true);
  6. });
  7. $(element).blur(function() {
  8. var value = valueAccessor();
  9. value(false);
  10. });
  11. },
  12. update: function(element, valueAccessor) {
  13. var value = valueAccessor();
  14. if (ko.unwrap(value))
  15. element.focus();
  16. else
  17. element.blur();
  18. }
  19. };

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

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

【Knockout】五、创建自定义绑定的更多相关文章

  1. Knockout应用开发指南 第五章:创建自定义绑定

    原文:Knockout应用开发指南 第五章:创建自定义绑定 创建自定义绑定 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定 ...

  2. (七)Knockout 创建自定义绑定

    创建自定义绑定 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义 ...

  3. KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定

    您不仅限于使用内置的绑定,如click,value绑定等,您可以创建自己的绑定. 这是如何控制视图模型如何与DOM元素进行交互,并且为您提供了大量的灵活性,以便于以复用的方式封装复杂的行为. 注册绑定 ...

  4. Knockout.Js官网学习(创建自定义绑定)

    前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...

  5. 5.Knockout.Js(自定义绑定)

    前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...

  6. KNOCKOUTJS DOCUMENTATION-绑定(BINDINGS)-自定义绑定

    除了ko内建的绑定,还可以自定义绑定,灵活地封装复杂的行为使之可重用. 自定义绑定 注册自定义绑定 向 ko.bindingHandles添加一个子属性来注册一个绑定. ko.bindingHandl ...

  7. WCF - 绑定后续之自定义绑定

    自定义信道基类 WCF是一个极具扩展性的通信框架 无论在服务模型层还是信道层 都具有很多扩展点 而信道层的扩展点主要体现在实现自定义信道以增强信道栈处理信息的能力 比如我们可以扩展信道层 实现一个自定 ...

  8. WCF - 自定义绑定

    自定义绑定 当系统提供的某个绑定不符合服务的要求时,可使用 CustomBinding 类.所有绑定都是从绑定元素的有序集构造而来的.自定义绑定可以从一组系统提供的绑定元素生成,也可以包含用户定义的自 ...

  9. Knockout.js(四):自定义绑定

    除了内嵌的绑定,还可以创建一些自定义绑定,封装复杂的逻辑或行为. 注册绑定 添加子属性到ko.bindingHandlers来注册绑定: ko.bindingHandlers.yourBindingN ...

随机推荐

  1. HDU 4438 Hunters (数学,概率计算)

    题意:猎人A和B要进行一场比赛.现在有两个猎物老虎和狼,打死老虎可以得X分,打死狼可以得Y分.现在有两种情况: (1)如果A与B的预定目标不同,那么他们都将猎到预定的目标. (2)如果A与B的预定目标 ...

  2. Spring Data JPA 教程(翻译)

    写那些数据挖掘之类的博文 写的比较累了,现在翻译一下关于spring data jpa的文章,觉得轻松多了. 翻译正文: 你有木有注意到,使用Java持久化的API的数据访问代码包含了很多不必要的模式 ...

  3. .NET Reflector插件FileDisassembler还原源码

    NET Reflector,它是一个类浏览器和反编译器,可以分析程序集并向您展示它的所有秘密..NET 框架向全世界引入了可用来分析任何基于 .NET 的代码(无论它是单个类还是完整的程序集)的反射概 ...

  4. ECSHOP数据表结构完整仔细说明教程

    From:http://www.ecshop119.com/ecshopjc-868.html s_account_log //用户账目日志表 字段 类型 Null 默认 注释 log_id medi ...

  5. ServletContext2

    ------------ContextServlet.java--------------节选-- protected void doGet(HttpServletRequest request, H ...

  6. Navicat for mysql 11.0破解方法

    Navicat for mysql破解器 首先下载破解器,然后解压至随意一个目录下.最后双击exe程序,按照提示找到你安装好的navicat for mysql文件夹下的navicat.exe程序,之 ...

  7. POJ 3261 Milk Patterns 可重复k次的最长重复子串

    Milk PatternsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=3261 Description ...

  8. delphi 立即显示提示

    procedure TForm1.FormCreate(Sender: TObject); begin  Application.HintPause:=0;//立即显示  Application.hi ...

  9. Linux用户及用户组设置

    查看当前用户所属的组 groups  查看<user1>, <user2> 和 <user3>所属的组 groups <user1> <user2 ...

  10. MySQL · 引擎特性 · InnoDB 事务子系统介绍

    http://mysql.taobao.org/monthly/2015/12/01/ 前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoD ...