Open Narutocc opened 6 years ago
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css"> <link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css"> </head> <body> <!-- ko foreach:{data:website,as:'$website'}--> <div class="panel panel-default"> <div class="panel-heading" style="position:relative;" data-bind="click:$root.showInfo"> <i class="fa fa-caret-right" aria-hidden="true" style="position:absolute;" data-bind="style:{display:$website.isShowInfo() ? 'none':'block'}"></i> <i class="fa fa-caret-down" aria-hidden="true" style="position:absolute;" data-bind="style:{display:$website.isShowInfo() ? 'block':'none'}"></i> <h3 class="panel-title" data-bind="text:$website.title" style="padding-left: 12px;"></h3> </div> <div data-bind="if:$website.isShowInfo"> <div class="panel-body" data-bind="text:$website.info"></div> </div> </div> <!-- /ko --> </body> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script> <script src="https://cdn.bootcss.com/knockout/3.4.2/knockout-min.js"></script> <script> function viewModel(){ var self = this; this.website = ko.observableArray([{ title:'Knockout', info:'Knockout是一个JavaScript库,可帮助您使用干净的底层数据模型创建丰富,响应式的显示和编辑器用户界面。' },{ title:'iOS', info:'iOS 是一个由苹果公司开发和发布的手机操作系统。最初是于 2007 年首次发布 iPhone、iPod Touch 和 Apple TV。iOS 派生自 OS X,它们共享 Darwin 基础。OS X 操作系统是用在苹果电脑上,iOS 是苹果的移动版本。' },{ title:'jmeter', info:'jMeter 是一款开源的测试软件。它是 100% 纯 Java 应用程序,用于负载和性能测试。' },{ title:'ejb', info:'Enterprise Java Beans(EJB)是一个创建高度可扩展性和强大企业级应用程序的开发架构,部署在兼容应用程序服务器(比如 JBOSS、Web Logic 等)的 J2EE 上。' }]) $.each(self.website(),function(n,v){ v.isShowInfo = ko.observable(false); }) this.showInfo = function(data){ var currentData = data; if(currentData.isShowInfo()) currentData.isShowInfo(false) else currentData.isShowInfo(true) } } ko.applyBindings(new viewModel()) </script> </html> <!-- 原理:给每个数据加上一个双向绑定的属性,用于判断是否显示该数据 -->
页面效果如下:
<div data-bind="click:showInfo.bind($data)"></div> js: ... this.showInfo = function(data){console.log(data)}
可以简写为:
<div data-bind="click:showInfo"></div> js: ... this.showInfo = function(data){console.log(data)}
页面效果如下:![qq 20171213113441](https://user-images.githubusercontent.com/23731437/33920588-c1ed6eec-dff9-11e7-9cca-1182b4ba2cb6.png)
knockout中事件可以不绑定数据,直接在js中事件的第一个参数即是当前点击的数据
可以简写为: