文章目录

  • knockoutjs总结
    • 特殊变量
      • $root
      • $parent
    • with绑定
    • 虚拟元素
    • 事件绑定及参数传递
    • 问题总结
      • 在layer中使用knock的奇怪问题
      • Knockout checkbox click 冲突

knockoutjs总结

之前写的两篇博客
knockoutJs在项目中的使用
knockout.js做table列表

参考
KnockOut : Introduction

特殊变量

$root

$root指的是ko所绑定的DOM,可以解决类似于作用域的问题,一般来说withforeach等,在对应的dom标签区间中的属性是对应于with绑定的对象以及foreach循环中每一个对象中的变量,如果想在该标签区间内使用ViewModel中的其它属性,则会报错说找不到或者未定义之类的,那么就需要使用$root来指定作用域为ViewModel.
如下代码

 <div class="input_list clearfix" data-bind="with:cpafInfoCondition"><div class="input_box clearfix"><div class="tabs-input clearfix fl"><p class="fl">行政区划</p><ul class="select fl"><li class="selected">-请选择-</li><li class="option"><ul data-bind="html:$root.divisionUl"></ul></li></ul></div>.....
self.cpafInfoCondition = ko.observable({currentPage:0,pageSize : 20,divisionProvince : '',cpafCno : '',cpafName : '',cpafStatus : '',cpaNumBegin : '',cpaNumEnd : '',orgForm : ''});...//区划self.divisionUl = (function () {

$parent

$parent 是指当前DOM元素直接的外部父类(只有一层);

with绑定

参考:knockoutjs六 with 绑定
在我看来,with是一个作用域或者上下文的限制。假设对象obj={key:val},那么在with:obj下可以直接使用key,而不需要使用obj.key
with还有个作用,当with的条件是null或者是undefined,那么下面的子元素就不会加载,如果不空就加载,这样就避免了一些错误,不会当obj是null或者是undefined的时候还调用obj.key发生报错。

虚拟元素

参考:Creating custom bindings that support virtual elements
如下


<!-- ko if:cpafNameNoData -->
<tr class="no-data"><td colspan="4">暂无符合条件的数据</td>
</tr>
<!-- /ko -->
<!-- ko foreach : cpafNameList -->
<tr class="midlist-top"><td class="zczsbh" data-bind="text:divisionProvince"></td><td class="zsxm" data-bind="text:cpafNo"></td><td class="zszt" data-bind="text:cpafName"></td><td class="swsmc" data-bind="text:cpafAbbr"></td>
</tr>
<!-- /ko -->

使用<!-- ko --><!-- /ko -->做一个虚拟节点,注意写法,**在–和尖括号之间是没有空格的,**个人觉得有点像vue中使用Template元素渲染的意思

事件绑定及参数传递

以click为例

  • 简单绑定
data-bind="click:funcName"
  • 如果有多个事件需要一起绑定
data-bind="event:{click:clickFuncName,change:changeFuncName}"
  • 如果需要传递参数
    默认的,knockout会传递两个参数出来。
    第一个参数是自己定义的ViewModel,第二个则是触发的event

    • 第一种方式
//这里的$data不可以省略
//这种方式,默认参数在最后.
data-bind="click:clickFuncName($data,'param1','param2')"
- 第二种方式
<button data-bind="click: function(data, event) { myFunction('param1', 'param2', data, event) }">Click me
</button>

问题总结

在layer中使用knock的奇怪问题

需求:当没有数据的时候显示"没有查询到符合条件的数据",否则显示数据
问题描述:当数据从无到有或者从有到无时,tbody再也无法显示任何内容了
问题代码如下

//layer弹出表格
layer.open({title: '处罚信息',type: 1,content: $(cpafPunish),area: ['1080px', '460px'],success: function () {cpafPunishViewModel = new CpafPunishViewModel();ko.cleanNode(cpafPunish);ko.applyBindings(cpafPunishViewModel, cpafPunish);cpafPunishViewModel.init(data.CPAF_NO);},end: function () {$(cpafPunish).hide();}});......
//表格的viewmodel
function CpafPunishViewModel() {var self = this;self.cpafPunishNoData = ko.observable(true);self.cpafPunishList = ko.observableArray([]);//查询列表self.init = function (cpafNo) {self.cpafPunishList([]);$.postAjax(contentPath + "/searchBfLogin/searchCpafPunish", {cpafNo: cpafNo}, function (list) {self.cpafPunishNoData(list.length < 1);self.cpafPunishList(list);}, true);}}

下表是表格

<div id="cpafPunish" style="display: none;height:50px;margin:0 auto;" class="layer_notice"><div class="table-wrap"><table class="conList"><thead><th width="80">行政区划</th><th width="150">事务所名称</th><th width="120">执业证书编号</th><th width="120">处罚类型</th><th width="120">做出处罚时间</th></thead><tbody class="midlist-body"><!-- ko if: cpafPunishNoData --><tr class="no-data"><td colspan="5">暂无符合条件的数据</td></tr><!-- /ko --><!-- ko foreach: cpafPunishList --><tr class="midlist-top"><td data-bind="text:DIVISION_NAME"></td><td data-bind="text:CPAF_NAME"></td><td data-bind="text:CPAF_CNO"></td><td data-bind="text:PUNISH_TYPE"></td><td data-bind="text:FILE_DATE"></td></tr><!-- /ko --></tbody></table></div>
</div>

解决问题的代码如下,即只new和绑定都只一次

self.viewPunish = function (data) {var cpafPunish = document.getElementById('cpafPunish');layer.open({title: '处罚信息',type: 1,content: $(cpafPunish),area: ['1080px', '460px'],success: function () {if (cpafPunishViewModel === undefined) {cpafPunishViewModel = new CpafPunishViewModel();ko.cleanNode(cpafPunish);ko.applyBindings(cpafPunishViewModel, cpafPunish);}cpafPunishViewModel.init(data.CPAF_NO);},end: function () {$(cpafPunish).hide();}});};

暂时还找不到合理的解释。

Knockout checkbox click 冲突

给checkbox绑定click,发现checkbox无法选中。网上查阅资料发现knockout在处理checkbox的checked和click时,需要一点小技巧
使用knockout同时绑定checked和click时,checkbox点击不勾选,在绑定的click事件中一定要返回true;

        self.checkAll = function () {var target = event.srcElement || event.target;$('.sfq-all-check').prop('checked', $(target).prop('checked'));return true;};

knockoutjs总结相关推荐

  1. [转]Knockoutjs快速入门

    本文转自:http://www.cnblogs.com/yinzixin/archive/2012/12/21/2827356.html Knockoutjs是一个JavaScript实现的MVVM框 ...

  2. MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法

    说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都在它的源码 ...

  3. MVVM架构~knockoutjs系列之验证成功提示显示

    对于knockout.validation来说,我们已经知道了如何去验证大部分表单元素,而有时,我们的需求希望在每个元素验证成功后,去显示正确的提示,这个我们很容易的使用self.元素.isValid ...

  4. MVVM架构~knockoutjs实现简单的购物车

    返回目录 概念相关 购物车相信大家都用过,很方便,可以将多个商品添加到购物车,并且可以修改购买商品的数据,当然为了用户体验好,在修改数据时,你的价格也会出现变化的,这使用JS可以实现,但我认为,代码量 ...

  5. knockoutjs ajax分页,KnockoutJS 3.X API 第四章之数据控制流foreach绑定

    foreach绑定 foreach绑定主要用于循环展示监控数组属性中的每一个元素,一般用于table标签中 假设你有一个监控属性数组,每当您添加,删除或重新排序数组项时,绑定将有效地更新UI的DOM- ...

  6. Magicodes.WeiChat——自定义knockoutjs template、component实现微信自定义菜单

    2019独角兽企业重金招聘Python工程师标准>>> 本人一向比较喜欢折腾,玩了这么久的knockoutjs,总觉得不够劲,于是又开始准备折腾自己了. 最近在完善Magicodes ...

  7. 重拾Javascript (四) KnockoutJs使用

    利用KnockoutJs来进行数据绑定及隔行不同样式或不同绑定数据操作 效果:[点击加载更多按钮 加载更多数据可从服务器来进行获取] 代码:[KO通过data-bind进行数据绑定 有TEXT,HTM ...

  8. java用mvvm,[Java教程]MVVM架构~使用boxy和knockoutjs实现编辑功能

    [Java教程]MVVM架构~使用boxy和knockoutjs实现编辑功能 0 2014-04-24 14:00:08 返回目录 这个功能我认为非常有用,尤其在后台管理系统中,它对用户来说,使用体验 ...

  9. KnockoutJS 3.X API 第一章 简介

    本文纯正翻译自官网API文档.其中包含一下个人理解. 官网API地址:http://knockoutjs.com/documentation/introduction.html 简介 Knockout ...

  10. Knockoutjs 实践入门 (2) 绑定事件

    Knockoutjs 绑定事件 Knockoutjs 不仅支持UI 元素的属性绑定到model的属性,还支持UI 元素的事件绑定model的事件. 需求: l  click me button 每单击 ...

最新文章

  1. cxgrid 保存数据_什么是大数据
  2. 提取图片纹理_Fundamentals Of Computer Graphics 第十一章 纹理映射(中)
  3. 听小鹏讲废话之OSI
  4. 三相pmsm矢量控制仿真模型_实时控制系统的时序模型及其在AUTOSAR系统仿真监控中的应用-Foundations4.1控制理论...
  5. 直接插入排序的python实现
  6. Collectors.toSet()
  7. Coaching 企业教练
  8. 【Android】3.21 示例21—兴趣点收藏功能
  9. 成功解决gyp verb ensuring that file exists: C:\Python27\python.exe gyp ERR! configure error gyp ERR! sta
  10. Editor: 维护一个整数编辑器 HDOJ4699
  11. 爬虫实战 爬取谷歌图片 Google images
  12. html提取excel指定单元格数据,怎样从很多的表格中提取指定单元格数据
  13. 地平线 J2J3了解笔记
  14. MySQL数据库有网络和无网络的部署
  15. 电子邮件里的CC和BCC的全称是什么?
  16. H5棋牌游戏app下载链接在微信中显示已停止访问或打不开的解决方案
  17. 如何利用淘宝快速推广新品牌
  18. Paddle入门实战系列(四):中文场景文字识别
  19. 【厂妹进谷歌】从富士康流水线小妹到 Google 工程师,She made it !!!
  20. jq遍历table的行 取input值

热门文章

  1. 电子信息工程专业概论_本科专业介绍 | 电子信息工程
  2. excel做地图热力图_如何用excel制作中国地图热力数据图
  3. (c++课程设计)简单车辆管理系统(有五种类型的车辆)代码+报告
  4. 自由软件运动与GNU项目
  5. cocos2dx资料汇总 - 持续更新
  6. 遗传算法matlab_三分钟学会遗传算法
  7. Python 打造最强表白程序(源码)
  8. C#数据库编程实战经典
  9. Oracle 客户端工具介绍
  10. 思科OSPF配置实例(转)