KnockoutJs学习笔记(九)
由于component binding部分的内容更为复杂一些,所以这部分我暂时跳过,先学习click binding部分。
click binding不仅可以作用于button、input、a等元素,也可以作用于其他任何可见的DOM元素。
下面是一个简单的例子:
html部分:
<div>
You've clicked <span data-bind="text: numberOfClicks"></span> times
<button data-bind="click: incrementClickCounter">Click me</button>
</div>
js部分:
function MyViewModel() {
var self = this;
self.numberOfClicks = ko.observable(0);
self.incrementClickCounter = function() {
var previousCount = self.numberOfClicks();
self.numberOfClicks(previousCount + 1);
};
} ko.applyBindings(new MyViewModel());
这里需要注意的是numberOfClicks的修改方法。
click binding不仅仅可以绑定viewModel中的方法,也可以绑定其他任意的方法。
注意一:在调用click binding的处理函数时,我们可以给它传递一个参数作为当前作用的项(current item),这种操作往往在处理集合或是数组时非常有用。
下面是一个简单的例子:
html部分:
<ul data-bind="foreach: people">
<li>
<span data-bind="text: $data"></span>
<button data-bind="click: $parent.removePerson">Remove</button>
</li>
</ul>
js部分:
function MyViewModel() {
var self = this;
self.people = ko.observableArray([ "Kazusa", "Chiaki", "Charlie" ]);
self.removePerson = function(person) {
self.people.remove(person);
};
} ko.applyBindings(new MyViewModel());
注意上例中关于$parent的使用,在使用foreach binding或是with binding时,一定要明确自己能够直接调用的viewModelProperty的范围,如果在更高的层次,则要考虑使用$parent或是$root这样的前缀。
注意二:在某些时候,我们需要获取与click事件相关联的DOM event object(说起来听绕口,我觉得可以直接就说是包含click在内的能够触发相应绑定的处理函数的事件),KO将这个事件作为处理函数的第二个参数,比如说我们希望在按下shift键的clik与一般的click有所区别,则可以利用这一参数在处理函数中进行区分。
如果我们需要传递更多的参数,有以下两种方式:
<button data-bind="click: function(data, event) { myFunction('param1', 'param2', data, event) }">
Click me
</button>
<button data-bind="click: myFunction.bind($data, 'param1', 'param2')">
Click me
</button>
其中第二种方式用到了bind方法,可以参考function.prototype.bind(),这个留作以后研究。
注意三:在默认情况下,使用click binding会屏蔽掉原先click的默认功能,比如对于一个a元素,在使用click binding之后,并不会跳转到href所描述的地址。如果我们希望恢复默认的功能,只需要在click binding所绑定的处理函数的最后返回一个true即可。
注意四:在某些时候,我们的html部分可能会存在嵌套的click binding的情况,如下:
<div data-bind="click: function1">
<div data-bind="click: function2">
<button data-bind="click: function3">Click me</button>
</div>
</div>
在这种情况下,如果我们点击页面上的button,则会依次触发function3、function2、function1。为了防止这种现象,我们可以在data-bind后附加clickBubble:false来阻止click事件继续向上传递,比如说我们将代码改成这样:
<div data-bind="click: function1">
<div data-bind="click: function2">
<button data-bind="click: function3, clickBubble: false">Click me</button>
</div>
</div>
这样一来就只会触发function3。而如果我们是在function2后面添加,则只会依次触发function3和function2,以此类推。
KnockoutJs学习笔记(九)的更多相关文章
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
<Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次 SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
- KnockoutJs学习笔记(五)
作为一名初学者来说,一篇篇的按顺序看官网上的文档的确是一件很痛苦的事情,毕竟它的排列也并非是由浅及深的排列,其中的顺序也颇耐人寻味,于是这篇文章我又跳过了Reference部分,进而进入到具体的bin ...
- vue学习笔记(九)vue-cli中的组件通信
前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...
- C#线程学习笔记九:async & await入门二
一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...
随机推荐
- mybatis 传递参数的两种方式与模糊匹配 很重要
- Jamie's Contact Groups POJ - 2289(多重匹配 最大值最小化 最大流)
Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 8567 Accepted: ...
- Spring Shell打Jar包时需要注意的地方
Spring-Shell打Jar包时需要注意的地方: 1.Main-Class spring-shell项目打Jar包的一个必要条件就是,指定Main-Class为org.springframew ...
- Lua 调试库
Lua 调试库 http://blog.csdn.net/vermilliontear/article/details/50851045 http://blog.csdn.net/vermillion ...
- 基于Maven构建的Spring+Mybatis项目
项目的目录结构: 1.基于Maven构建Web项目 参考:基于Maven构建Web项目 2.导入项目依赖 Spring 核心容器(Beans.Core.Context.Context support. ...
- springboot通过ssh通道连接mysql数据库
navicat可以通过ssh通道连接mysql数据库,那java中如何实现了,springboot又该怎样集成呢? 1.添加包 <dependency> <groupId>co ...
- HDU 1611 敌兵布阵 / HRBUST 1794 敌兵布阵(线段树)
HDU 1611 敌兵布阵 / HRBUST 1794 敌兵布阵(线段树) Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...
- 【hihocoder】二分·归并排序之逆序对
描述 在上一回.上上回以及上上上回里我们知道Nettle在玩<艦これ>.经过了一番苦战之后,Nettle又获得了的很多很多的船.这一天Nettle在检查自己的舰队列表:我们可以看到,船默认 ...
- 鸟哥的Linux私房菜——第十一章
视频链接: 土豆:http://www.tudou.com/programs/view/yT0PfIWU720 B站(推荐): http://www.bilibili.com/video/av9877 ...
- 用代码块在new对象时set属性
看到这样一种用法,很方便 request.setRequestHead(new RequestHeadType() {{ setRequestor("Online"); setRe ...