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

  

  注册绑定

  添加子属性到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>

最新文章

  1. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
  2. HDU1166线段树(单点更新,区间求和)
  3. Thinking in Java--笔记(2)
  4. [置顶] Jquery学习总结(二) jquery选择器详解
  5. iphone dev 入门实例6:How To Use UIScrollView to Scroll and Zoom and Page
  6. emWin(ucGui) Edit控件数值模式 ——符号编辑 worldsing
  7. CODEVS 2994 超级弹珠
  8. python - XML文件及其操作
  9. NYOJ 45 棋盘覆盖 模拟+高精度
  10. web前端面试题记录
  11. cips2016+学习笔记︱简述常见的语言表示模型(词嵌入、句表示、篇章表示)
  12. 【RL-TCPnet网络教程】第24章 RL-TCPnet之网络控制报文协议ICMP
  13. tensorflow会话控制-【老鱼学tensorflow】
  14. H5页面访问java后台进行登录拦截
  15. mysql 原理 ~ 线程与IO
  16. spring 集成 mybatis
  17. (后台)java 读取excel 文件 Unable to recognize OLE stream 错误
  18. shift 用法
  19. CodeForces - 325E:The Red Button (哈密尔顿 转 欧拉回路)
  20. ASP.NET Core 2 学习笔记(十二)REST-Like API

热门文章

  1. java多线程机制2(安全问题)
  2. Gmail登录(2017.10)
  3. android Timer TimerTask用法笔记
  4. Linux内存高,触发oom-killer问题解决
  5. 实现UE添加自定义按钮之添加菜单
  6. python模块之itertools
  7. Windows: 如何配置IPv6隧道
  8. 摄像机distortion vector、project matrix、camera matrix
  9. html学习-css
  10. objective-c Quick Reference