由于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学习笔记(九)的更多相关文章

  1. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  2. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

  3. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  4. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  5. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  6. Python学习笔记九

    Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...

  7. KnockoutJs学习笔记(五)

    作为一名初学者来说,一篇篇的按顺序看官网上的文档的确是一件很痛苦的事情,毕竟它的排列也并非是由浅及深的排列,其中的顺序也颇耐人寻味,于是这篇文章我又跳过了Reference部分,进而进入到具体的bin ...

  8. vue学习笔记(九)vue-cli中的组件通信

    前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...

  9. C#线程学习笔记九:async & await入门二

    一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...

随机推荐

  1. angular学习总结

    因为学习需要,要配置一系列环境,中间又出了很多各种各样的花式错误,因此当做个人总结记录一下.一.vs1. 完全卸载VS2013找到vs2013的安装包,如图 打开cmd命令行窗口,cd到安装包下的vs ...

  2. Again Prime? No Time. UVA - 10780(质因子分解)

    m^k就是让m的每个质因子个数都增加了k倍 求m的质因子 在n!中增加了多少倍就好了,因为m^k 表示每一个质因子增加相同的倍数k  所以我们需要找到增加倍数最小的那个..短板效应  其它质因子多增加 ...

  3. Steady Cow Assignment POJ - 3189 (最大流+匹配)

    Farmer John's N (1 <= N <= 1000) cows each reside in one of B (1 <= B <= 20) barns which ...

  4. youcompleteme 自动补全

    1. 拷贝配置文件 cp ~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py ~/.vim/.ycm_extra_conf.py 2. 修改配 ...

  5. 【codeforces 666E】 Forensic Examination

    http://codeforces.com/problemset/problem/666/E (题目链接) 题意 给出一个主串$S$,$n$个匹配串编号从$1$到$n$.$m$组询问,每次询问主串的一 ...

  6. 51 nod 1200 石子游戏V2 FWT

    放模板 #include<bits/stdc++.h> #define N 100005 using namespace std; const int p = 1000000007; in ...

  7. 51nod 1479 小Y的数论题

    一脸不可做题~~~233333 T<=100000,所以一定要logn出解啦. 但是完全没有头绪*&#……%*&……()……#¥*#@ 题解: 因为2^p+2^p=2^(p+1) ...

  8. duilib bkimage 属性

    duilib bkimage 属性<Attribute name="bkimage" default="" type="STRING" ...

  9. django xadmin 安装和使用

    官方文档: http://xadmin.readthedocs.io/en/docs-chinese/ 版本:django1.9 pip安装部署 pip install xadmin settings ...

  10. c#的事件用法——实现下载时发生的事件

    //下载时发出的事件 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...