Knockout.js(四):自定义绑定
除了内嵌的绑定,还可以创建一些自定义绑定,封装复杂的逻辑或行为。
注册绑定
添加子属性到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(四):自定义绑定的更多相关文章
- 5.Knockout.Js(自定义绑定)
前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...
- 4.Knockout.Js(事件绑定)
前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h ...
- 3.Knockout.Js(属性绑定)
前言 让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值. 简单的绑定 首先还是先定义一个ViewModel var AppViewModel = { shou ...
- 【Knockout】四、绑定上下文
Binding context binding context是一个保存数据的对象,你可以在你的绑定中引用它.当应用绑定的时候,knockout自动创建和管理binding context的继承关系. ...
- Knockout.Js学习目录
1.Knockout.Js(简介) 2.Knockout.Js(监控属性Observables) 3.Knockout.Js(属性绑定) 4.Knockout.Js(事件绑定) 5.Knockout. ...
- 【Knockout.js 学习体验之旅】(3)模板绑定
本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 固定Table的头部和左边的列-在Knockout Js使用场景下
要求:固定Table的头部和左边的列 场景:Knockout Js被用于绑定Table的数据源. 固定HTML表格的头部和列是一个很常见的需求.此文:http://www.cnblogs.com/so ...
- knockout.js的简介和简单使用
1.knockout简介knockout是一个轻量级的UI类库,通过MVVM模式使JavaScript前端UI简单化knockout有四大重要概念:1)声明式绑定:使用简明移读的语法很容易地将模型(m ...
- Knockout.Js官网学习(创建自定义绑定)
前言 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定.例如,你可以在form表单里自定义像grid ...
随机推荐
- 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]
Vladik and Entertaining Flags Time Limit: 20 Sec Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- 【leetcode 简单】第十四题 最后一个单词的长度
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...
- 设置display:inline-block产生间隙
display:inline-block产生间隙,是由于换行在内的空白符 display:inline-block在IE下仅仅是触发了layout,而它本是行布局,触发后,块元素依然还是行布局.所以需 ...
- NYOJ 163 Phone List (字符串处理 字典树)
题目链接 描述 Given a list of phone numbers, determine if it is consistent in the sense that no number is ...
- Linux Deploy 使用 Repository部署Linux系统
Linux Deploy 使用 Repository部署Linux系统 为了解决镜像不稳定导致包下载错误,能得到一个稳定环境,可以使用linux deploy导出功能. 这里提供两个制作好的包 用户名 ...
- Hbuilder连接第3方模拟器(夜神)
http://www.bcty365.com/content-146-5148-1.html
- python设计模式之内置装饰器使用(四)
前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...
- i8042 键盘控制器-------详细介绍
[转]http://shanzy.bokee.com/834368.html ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片.一个是 intel 8042 芯片,位于主板上, ...
- 190.Reverse Bits---位运算
题目链接:https://leetcode.com/problems/reverse-bits/description/ 题目大意:将数值的二进制反转. 法一(借鉴):由于是无符号32位整型,当二进制 ...