Knockuot js 似乎只考虑过怎么绑定(ko.applyBindings()),却没考虑过怎么去除绑定,当修改了DOM内容,需要重新绑定时,发现似乎无能为力。

一、解决办法

这里有一个重新绑定的方法,就是使用ko.cleanNode(<YOUR DOM NODE>),然后再使用ko.applyBindings()重新绑定就可以了。

1、VIEW模型

  1. <h3>3、更改绑定</h3>
  2. <div id="divSample3">
  3. 你叫啥?<span id='span3' data-bind='text: name'></span><br/>
  4. <a href="javascript:void(0)" onclick="updateBingding()">我问的是别名!</a>
  5. </div>

2、VIEW-MODEL

  1. <script type="text/javascript">
  2. var viewModel = function () {
  3. this.name = ko.observable("张三");
  4. this.aliasName = ko.observable("三儿");
  5. };
  6. //var myModel = new viewModel();
  7. ko.applyBindings(new viewModel(),document.getElementById('divSample3'));
  8. var viewModel2 = function () {
  9. this.name = ko.observable("张三");
  10. this.aliasName = ko.observable("三儿");
  11. };
  12. //更改绑定
  13. function updateBingding(){
  14. //$("#span3").attr("data-bind", "text: aliasName");  //使用jQuery
  15. var span3 = document.getElementById('span3'); //不使用jQuery
  16. span3.setAttribute("data-bind", "text:aliasName");
  17. ko.cleanNode(span3);
  18. ko.applyBindings( new viewModel2(), span3);
  19. }
  20. </script>

二、问题

1、但是据说这样可能存在问题,问题之一是与DOM相关的事件绑定是没法去除的。

这里提供一个外国哥们使用的方法:

  1. <script lang="javascript">
  2. ko.unapplyBindings = function ($node, remove) {
  3. // unbind events
  4. $node.find("*").each(function(){
  5. $(this).unbind();
  6. });
  7. // Remove KO subscriptions and references
  8. if(remove) {
  9. ko.removeNode($node[0]);
  10. } else {
  11. ko.cleanNode($node[0]);
  12. }
  13. };
  14. </script>

这个方法使用jQuery方法在取消绑定前,去除绑定的事件,然后再清除缓存的绑定配置,同时具有一定的通用性。

但这个方法应只对jQuery的事件绑定有效,如果使用其他方式绑定的事件,可能去除不彻底。

2、建议尽量使用if或with绑定来控制,使用下面的形式来操作,灵活性肯定不如直接使用JavaScript操作方便。

<!-- ko if: editortype == 'checkbox' -->\
         ...
<!-- /ko -->\

三、增加和移除绑定

增加绑定即动态增加一个DOM节点,然后再绑定该DOM节点。移除绑定即将DOM节点原有的绑定给去除,不让绑定操作再生效。

1、增加绑定

VIEW模型:

  1. <h3>1、动态添加绑定</h3>
  2. <div id="divSample1">
  3. <a href="javascript:void(0)" onclick="add_Binding()">添加绑定</a>
  4. </div>

VM模型:

  1. <script type="text/javascript">
  2. var viewModel = function () {
  3. };
  4. var myModel = new viewModel();
  5. //添加绑定
  6. function add_Binding(){
  7. //viewModel添加属性
  8. myModel.des = ko.observable("this is a demo");
  9. //添加绑定元素
  10. var html = "<span id='add_banding' data-bind='html: des'></span>";
  11. document.body.innerHTML = document.body.innerHTML + html;
  12. var add = document.getElementById("add_banding");
  13. ko.applyBindings(myModel, add);
  14. }
  15. </script>

2、去除绑定

VIEW模型:

  1. <h3>2、移除绑定</h3>
  2. <div id="divSample2">
  3. 原始值:<span id='span1' data-bind='text: des'></span><br/>
  4. 对照值:<span id='span2' data-bind='text: des'></span><br/>
  5. <a href="javascript:void(0)" onclick="changeModelValue()">改变model属性值</a>
  6. <a href="javascript:void(0)" onclick="removeBingding()">去除"对照值"的绑定</a>
  7. </div>

VM模型:

  1. <script type="text/javascript">
  2. var viewModel = function () {
  3. this.des = ko.observable("this is a demo");
  4. };
  5. var myModel = new viewModel();
  6. ko.applyBindings(myModel, document.getElementById("divSample2"));
  7. //改变des值
  8. function changeModelValue(){
  9. myModel.des(new Date().valueOf());
  10. }
  11. //移除绑定
  12. function removeBingding(){
  13. var span2 = document.getElementById("span2");
  14. alert(span2.getAttribute('data-bind'));
  15. span2.setAttribute("data-bind", "");
  16. alert(span2.getAttribute('data-bind'));
  17. ko.cleanNode(span2);
  18. ko.applyBindings(myModel, span2);
  19. }
  20. </script>

说明:此例参照了网上一位兄弟的示例,其思路比较清晰,但其提供的示例并没有真正解决多次绑定的问题,向这位兄弟表示感谢。

参考:

1、How to clear/remove observable bindings in Knockout.js?

2、knockout动态添加、移除绑定

Knockout JS 增加、去除、修改绑定的更多相关文章

  1. 一个简单的knockout.js 和easyui的绑定

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Basi ...

  2. Knockout.js(四):自定义绑定

    除了内嵌的绑定,还可以创建一些自定义绑定,封装复杂的逻辑或行为. 注册绑定 添加子属性到ko.bindingHandlers来注册绑定: ko.bindingHandlers.yourBindingN ...

  3. 【Knockout.js 学习体验之旅】(3)模板绑定

    本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...

  4. 4.Knockout.Js(事件绑定)

    前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h ...

  5. knockout更新列表中的某条数据,knockout.js绑定数组时更新其中一条数据

    knockout是一款前端实现MVVM的JS框架,仅knockout.js一个47kb的文件,相当实用,做前端无刷新页面,快速实现JS与HTML数据交互. knockout目前最新版:knockout ...

  6. knockout.js模板绑定之利用Underscore.js模板引擎示例

    View代码 <h1>People</h1> <ul data-bind="template: { name: 'peopleList' }"> ...

  7. Knockout.js随手记(3)

    下拉菜单 <select>也是网页设计重要的一环,knockout.js(以下简称KO)也有不错的支持.针对<select>,在data-bind除了用value可对应下拉菜单 ...

  8. MVC3.0+knockout.js+Ajax 实现简单的增删改查

    MVC3.0+knockout.js+Ajax 实现简单的增删改查 自从到北京入职以来就再也没有接触MVC,很多都已经淡忘了,最近一直在看knockout.js 和webAPI,本来打算采用MVC+k ...

  9. MVC中利用knockout.js实现动态uniqueId

    题目比较拗口,但是这篇文章确实直说这一点. knockout.js是一个JS库,它的官网是http://knockoutjs.com/ 这篇文章的重点是knockout在工作的一个功能中的应用.最终效 ...

随机推荐

  1. Leetcode刷题记录:构建最大数二叉树

    题目要求,题目地址 给定一个不含重复数字的数组,最大二叉树构建规则如下: 1.根是数组中最大的数字 2.左边的子树是最大数字左边的内容 3.右边的子树是最大数字右边的内容 答案 class Solut ...

  2. 【转】qt ,使用tcp/ip协议网络传输数据时,字节序转换方法

    网络传输数据是需要保证字节序的正确,才能保证传输数据的准确,网络字节序一般是大端字节序.qt提供了以下两种方法来将本地字节序转换为网络字节序: 方法一,使用qt提供的字节序转换函数 T qFromBi ...

  3. 一种模块化开发的目录结构和部署tips

    开发环境 开发态目录结构类似: 然后用express的static,将上下文映射到static那级目录上,比如访问: http://ip:5000/employee/employeeList.html ...

  4. android 很多应用中用到的 listView + viewPager

    比如网易啊啥的, 有些界面的 listview 第一行是可以 左右滑动的 viewpager,当滑动下面listView的时候 会一起滑动上去 工程目录: 效果图:                   ...

  5. [leetcode]Subsets II @ Python

    原题地址:https://oj.leetcode.com/problems/subsets-ii/ 题意: Given a collection of integers that might cont ...

  6. window.location属性用法及解决一个window.location.search为什么为空的问题

    通常用window.location该属性获取页面 URL 地址: 1.什么是window.location? 比如URL:http://b.a.com:88/index.php?name=kang& ...

  7. Tensorflow中张量数据类型的转换

    https://blog.csdn.net/Tramac/article/details/74942587 字符串转为数字: tf.string_to_number (string_tensor, o ...

  8. 机器学习-->期望风险、经验风险与结构风险之间的关系

    https://blog.csdn.net/liyajuan521/article/details/44565269 在机器学习中,通常会遇到期望风险.经验风险和结构风险这三个概念,一直不知道这三个概 ...

  9. FastText 文本分类使用心得

    http://blog.csdn.net/thriving_fcl/article/details/53239856 最近在一个项目里使用了fasttext[1], 这是facebook今年开源的一个 ...

  10. 模拟日历计算 poj1008

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 69932   Accepted: 21524 D ...