KnockoutJS 3.X API 第四章之click绑定


Posted in Javascript onOctober 10, 2016

目的

click绑定主要作用是用于DOM元素被点击时调用相关JS函数。最常见用于button、input、a元素。

例如:

You've clicked 0timesClick me

源码:

<div>
You've clicked <span data-bind="text: numberOfClicks"></span> times
<button data-bind="click: incrementClickCounter">Click me</button>
</div>
<script type="text/javascript">
var viewModel = {
numberOfClicks : ko.observable(0),
incrementClickCounter : function() {
var previousCount = this.numberOfClicks();
this.numberOfClicks(previousCount + 1);
}
};
</script>

如上述例子,没点过button被点击时都会触发incrementClickCounter 回调函数,从而更新视图状态。

备注,click后所跟的并不一定非得是视图模型的函数。可以是任何对象的函数,直接引用即可。例如:click: someObject.someFunction。

备注1:传递一个参数

当您的处理程序中,UI展示了一个监控属性数组,例如:

LondonRemove
ParisRemove
TokyoRemove

源码:

<ul data-bind="foreach: places">
<li>
<span data-bind="text: $data"></span>
<button data-bind="click: $parent.removePlace">Remove</button>
</li>
</ul>
<script type="text/javascript">
function MyViewModel() {
var self = this;
self.places = ko.observableArray(['London', 'Paris', 'Tokyo']);
// The current item will be passed as the first parameter, so we know which place to remove
self.removePlace = function(place) {
self.places.remove(place)
}
}
ko.applyBindings(new MyViewModel());
</script>

当点击remove时只会删除当前的项目,从源码上看,说明传递的是当前项目。这种在渲染集合数据的时候特别有用。

需要注意两点:

如果你是一个嵌套在绑定上下文,例如,如果使用foreach或with绑定,但你的处理函数是根视图模型或其他一些父模型,你需要使用一个前缀,如$parent或$root定位处理函数。
在您的视图模型,但是这是可以使用self(或其他一些变量)作为this的一个别名。

备注2:传递事件对象(多参数)

一些情况下,你可能需要访问DOM的事件对象(event),一般情况下KO会将事件对象作为第二个参数传递给函数。例如:

<button data-bind="click: myFunction">
Click me
</button>
<script type="text/javascript">
var viewModel = {
myFunction: function(data, event) {
if (event.shiftKey) {
//do something different when user has shift key down
} else {
//do normal action
}
}
};
ko.applyBindings(viewModel);
</script>

如果你要传递更多的参数,可以使用函数文本的方式。例如:

<button data-bind="click: function(data, event) { myFunction('param1', 'param2', data, event) }">
Click me
</button>

还有更优雅的写法,比如使用bind函数绑定多个参数。例如:

<button data-bind="click: myFunction.bind($data, 'param1', 'param2')">
Click me
</button>

备注3:允许默认点击动作

默认情况下,Ko会阻止任何默认动作。比如你把click绑定到一个a标签上,当点击时,浏览器会调用click绑定的回调函数。但是不会执行href的连接跳转。

如果你不希望这种默认的阻止动作。可以在回调函数中返回true。

备注4:防止冒泡事件

默认情况下,KO允许click绑定继续到任何高级别的事件处理。例如,父元素和子元素都有click绑定,那么这两个元素的click绑定会都被触发。

可以使用一个附加绑定clickBubble来解决该问题:

<div data-bind="click: myDivHandler">
<button data-bind="click: myButtonHandler, clickBubble: false">
Click me
</button>
</div>

如上述例子,myButtonHandler将被调用,而附件绑定clickBubble,并设置了false,这至使父元素的myDivHandler不会被调用。

备注5:与Jquery互动

如果存在Jquery的click事件,KO将会去调用Jquery的click事件,如果你想总是使用自己本地的事件来处理,可以在ko.applyBindings中加入如下代码:

ko.options.useOnlyNativeEvents = true;

以上所述是小编给大家介绍的KnockoutJS 3.X API 第四章之click绑定,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery boxy弹出层插件中文演示及使用讲解
Feb 24 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 Javascript
用html+css+js实现的一个简单的图片切换特效
May 28 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
Oct 17 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
Oct 17 Javascript
vue中动态绑定表单元素的属性方法
Feb 23 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
详解javascript appendChild()的完整功能
Aug 18 Javascript
微信小程序实现左右列表联动
May 19 Javascript
vue项目中仿element-ui弹框效果的实例代码
Apr 22 Javascript
vue 搭建后台系统模块化开发详解
May 01 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
Jun 11 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 #Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
Oct 10 #Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 #Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
Oct 10 #Javascript
浅谈jquery中使用canvas的问题
Oct 10 #Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
Oct 10 #Javascript
You might like
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
来自国外的页面JavaScript文件优化
2010/12/08 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
对Python _取log的几种方式小结
2019/07/25 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
html5唤醒APP小记
2019/03/27 HTML / CSS
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
小学音乐教学反思
2014/02/05 职场文书
食品安全责任书
2014/04/15 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis