除了内嵌的绑定,还可以创建一些自定义绑定,封装复杂的逻辑或行为。

  

  注册绑定

  添加子属性到ko.bindingHandlers来注册绑定:

ko.bindingHandlers.yourBindingName = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
// 第一次应用于元素时调用,在这里设置任何初始状态,事件处理程序等
}, update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
// 当绑定首先应用于元素时,将被调用一次,并且每当相关联的observable更改值时,都会被调用一次。并根据这里提供的值更新DOM元素。
}
};

  然后在DOM元素上调用:

<div data-bind="yourBindingName: someValue"> </div>

  init和update这两个函数不是必须都定义,也可以只定义其中一个。

  当管理的observable改变的时候,KO会调用回调函数,传递一下参数:

  ♦ element:使用这个绑定的DOM元素

  ♦ valueAccessor:JavaScript函数,通过valueAccessor()可以得到应用到这个绑定的model上的当前属性值。

  ♦ allBindingsAccessor:JavaScript函数,通过allBindingsAccessor ()得到这个元素上所有model的属性值。

  ♦ viewModel :传递给ko.applyBindings使用的 view model参数,如果是模板内部的话,那这个参数就是传递给该模板的数据。

  init回调

  Knockout在DOM元素使用自定义绑定的时候会调用init函数。init的用途:

  ♦ 为DOM元素设置初始值

  ♦ 注册事件handle,例如当用户点击或者编辑DOM元素的时候,可以改变相关的的observable值的状态。

  可以在页面第一次显示的时候设置该元素的状态(但是不使用任何动画效果),而只是让动画在以后改变的时候再执行。

ko.bindingHandlers.hideControl= {
init: function(element, valueAccessor, allBindingsAccessor,viewModel) {
var flag = localStorage.flag;
// 获取本地存储中的flag值
if(flag == 1){
$(element).hide();
}
},
update: function(element, valueAccessor, allBindingsAccessor,viewModel) {
}
};

  update回调

  通过visible绑定来控制一个元素的可见性,但是想让该元素在隐藏或者显示的时候加入动画效果。可以自定义自己的绑定来调用jQuery的slideUp/slideDown函数

ko.bindingHandlers.slideVisible = {
update: function(element, valueAccessor, allBindingsAccessor) {
// 首先获取最新的绑定值
var value = valueAccessor(), allBindings = allBindingsAccessor(); // 不管所提供的模型属性是否可观察到,获取其当前值
var valueUnwrapped = ko.utils.unwrapObservable(value); // 从另一个绑定属性中获取更多数据,除非另有说明,否则默认为400ms
var duration = allBindings.slideDuration || 400; // 操作DOM元素
if (valueUnwrapped == true)
$(element).slideDown(duration);
else
$(element).slideUp(duration);
}
};

  其他形式的事件

  知道了如何使用update回调,当obeservable值改变的时候,可以更新相关的DOM元素,对于其他形式的事件(如用户点击某个element的事件)想要更新相关的observable值。

  可以使用init回调来注册一个事件handle,这样可以改变相关的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.utils.unwrapObservable(value))
element.focus();
else
element.blur();
}
};

  在DOM上调用

<p>Name: <input data-bind="hasFocus: editingName"/></p>
<div data-bind="visible: editingName">You're editing the name</div>
<button data-bind="enable: !editingName(), click:function() { editingName(true) }">Edit name</button>

  绑定viewModel

<script type="text/javascript">
var viewModel = {
editingName: ko.observable()
};
ko.applyBindings(viewModel);
</script>

Knockout.js(四):自定义绑定的更多相关文章

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

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

  2. 4.Knockout.Js(事件绑定)

    前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h ...

  3. 3.Knockout.Js(属性绑定)

    前言 让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值. 简单的绑定 首先还是先定义一个ViewModel var AppViewModel = { shou ...

  4. 【Knockout】四、绑定上下文

    Binding context binding context是一个保存数据的对象,你可以在你的绑定中引用它.当应用绑定的时候,knockout自动创建和管理binding context的继承关系. ...

  5. Knockout.Js学习目录

    1.Knockout.Js(简介) 2.Knockout.Js(监控属性Observables) 3.Knockout.Js(属性绑定) 4.Knockout.Js(事件绑定) 5.Knockout. ...

  6. 【Knockout.js 学习体验之旅】(3)模板绑定

    本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...

  7. 固定Table的头部和左边的列-在Knockout Js使用场景下

    要求:固定Table的头部和左边的列 场景:Knockout Js被用于绑定Table的数据源. 固定HTML表格的头部和列是一个很常见的需求.此文:http://www.cnblogs.com/so ...

  8. knockout.js的简介和简单使用

    1.knockout简介knockout是一个轻量级的UI类库,通过MVVM模式使JavaScript前端UI简单化knockout有四大重要概念:1)声明式绑定:使用简明移读的语法很容易地将模型(m ...

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

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

随机推荐

  1. 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]

    Vladik and Entertaining Flags Time Limit: 20 Sec  Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...

  2. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  3. 【leetcode 简单】第十四题 最后一个单词的长度

    给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...

  4. 设置display:inline-block产生间隙

    display:inline-block产生间隙,是由于换行在内的空白符 display:inline-block在IE下仅仅是触发了layout,而它本是行布局,触发后,块元素依然还是行布局.所以需 ...

  5. NYOJ 163 Phone List (字符串处理 字典树)

    题目链接 描述 Given a list of phone numbers, determine if it is consistent in the sense that no number is ...

  6. Linux Deploy 使用 Repository部署Linux系统

    Linux Deploy 使用 Repository部署Linux系统 为了解决镜像不稳定导致包下载错误,能得到一个稳定环境,可以使用linux deploy导出功能. 这里提供两个制作好的包 用户名 ...

  7. Hbuilder连接第3方模拟器(夜神)

    http://www.bcty365.com/content-146-5148-1.html

  8. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

  9. i8042 键盘控制器-------详细介绍

    [转]http://shanzy.bokee.com/834368.html ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片.一个是 intel 8042 芯片,位于主板上, ...

  10. 190.Reverse Bits---位运算

    题目链接:https://leetcode.com/problems/reverse-bits/description/ 题目大意:将数值的二进制反转. 法一(借鉴):由于是无符号32位整型,当二进制 ...