Knockout JS 增加、去除、修改绑定
Knockuot js 似乎只考虑过怎么绑定(ko.applyBindings()),却没考虑过怎么去除绑定,当修改了DOM内容,需要重新绑定时,发现似乎无能为力。
一、解决办法
这里有一个重新绑定的方法,就是使用ko.cleanNode(<YOUR DOM NODE>),然后再使用ko.applyBindings()重新绑定就可以了。
1、VIEW模型
- <h3>3、更改绑定</h3>
- <div id="divSample3">
- 你叫啥?<span id='span3' data-bind='text: name'></span><br/>
- <a href="javascript:void(0)" onclick="updateBingding()">我问的是别名!</a>
- </div>
2、VIEW-MODEL
- <script type="text/javascript">
- var viewModel = function () {
- this.name = ko.observable("张三");
- this.aliasName = ko.observable("三儿");
- };
- //var myModel = new viewModel();
- ko.applyBindings(new viewModel(),document.getElementById('divSample3'));
- var viewModel2 = function () {
- this.name = ko.observable("张三");
- this.aliasName = ko.observable("三儿");
- };
- //更改绑定
- function updateBingding(){
- //$("#span3").attr("data-bind", "text: aliasName"); //使用jQuery
- var span3 = document.getElementById('span3'); //不使用jQuery
- span3.setAttribute("data-bind", "text:aliasName");
- ko.cleanNode(span3);
- ko.applyBindings( new viewModel2(), span3);
- }
- </script>
二、问题
1、但是据说这样可能存在问题,问题之一是与DOM相关的事件绑定是没法去除的。
这里提供一个外国哥们使用的方法:
- <script lang="javascript">
- ko.unapplyBindings = function ($node, remove) {
- // unbind events
- $node.find("*").each(function(){
- $(this).unbind();
- });
- // Remove KO subscriptions and references
- if(remove) {
- ko.removeNode($node[0]);
- } else {
- ko.cleanNode($node[0]);
- }
- };
- </script>
这个方法使用jQuery方法在取消绑定前,去除绑定的事件,然后再清除缓存的绑定配置,同时具有一定的通用性。
但这个方法应只对jQuery的事件绑定有效,如果使用其他方式绑定的事件,可能去除不彻底。
2、建议尽量使用if或with绑定来控制,使用下面的形式来操作,灵活性肯定不如直接使用JavaScript操作方便。
<!-- ko if: editortype == 'checkbox' -->\
...
<!-- /ko -->\
三、增加和移除绑定
增加绑定即动态增加一个DOM节点,然后再绑定该DOM节点。移除绑定即将DOM节点原有的绑定给去除,不让绑定操作再生效。
1、增加绑定
VIEW模型:
- <h3>1、动态添加绑定</h3>
- <div id="divSample1">
- <a href="javascript:void(0)" onclick="add_Binding()">添加绑定</a>
- </div>
VM模型:
- <script type="text/javascript">
- var viewModel = function () {
- };
- var myModel = new viewModel();
- //添加绑定
- function add_Binding(){
- //viewModel添加属性
- myModel.des = ko.observable("this is a demo");
- //添加绑定元素
- var html = "<span id='add_banding' data-bind='html: des'></span>";
- document.body.innerHTML = document.body.innerHTML + html;
- var add = document.getElementById("add_banding");
- ko.applyBindings(myModel, add);
- }
- </script>
2、去除绑定
VIEW模型:
- <h3>2、移除绑定</h3>
- <div id="divSample2">
- 原始值:<span id='span1' data-bind='text: des'></span><br/>
- 对照值:<span id='span2' data-bind='text: des'></span><br/>
- <a href="javascript:void(0)" onclick="changeModelValue()">改变model属性值</a>
- <a href="javascript:void(0)" onclick="removeBingding()">去除"对照值"的绑定</a>
- </div>
VM模型:
- <script type="text/javascript">
- var viewModel = function () {
- this.des = ko.observable("this is a demo");
- };
- var myModel = new viewModel();
- ko.applyBindings(myModel, document.getElementById("divSample2"));
- //改变des值
- function changeModelValue(){
- myModel.des(new Date().valueOf());
- }
- //移除绑定
- function removeBingding(){
- var span2 = document.getElementById("span2");
- alert(span2.getAttribute('data-bind'));
- span2.setAttribute("data-bind", "");
- alert(span2.getAttribute('data-bind'));
- ko.cleanNode(span2);
- ko.applyBindings(myModel, span2);
- }
- </script>
说明:此例参照了网上一位兄弟的示例,其思路比较清晰,但其提供的示例并没有真正解决多次绑定的问题,向这位兄弟表示感谢。
参考:
1、How to clear/remove observable bindings in Knockout.js?
Knockout JS 增加、去除、修改绑定的更多相关文章
- 一个简单的knockout.js 和easyui的绑定
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Basi ...
- Knockout.js(四):自定义绑定
除了内嵌的绑定,还可以创建一些自定义绑定,封装复杂的逻辑或行为. 注册绑定 添加子属性到ko.bindingHandlers来注册绑定: ko.bindingHandlers.yourBindingN ...
- 【Knockout.js 学习体验之旅】(3)模板绑定
本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 4.Knockout.Js(事件绑定)
前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h ...
- knockout更新列表中的某条数据,knockout.js绑定数组时更新其中一条数据
knockout是一款前端实现MVVM的JS框架,仅knockout.js一个47kb的文件,相当实用,做前端无刷新页面,快速实现JS与HTML数据交互. knockout目前最新版:knockout ...
- knockout.js模板绑定之利用Underscore.js模板引擎示例
View代码 <h1>People</h1> <ul data-bind="template: { name: 'peopleList' }"> ...
- Knockout.js随手记(3)
下拉菜单 <select>也是网页设计重要的一环,knockout.js(以下简称KO)也有不错的支持.针对<select>,在data-bind除了用value可对应下拉菜单 ...
- MVC3.0+knockout.js+Ajax 实现简单的增删改查
MVC3.0+knockout.js+Ajax 实现简单的增删改查 自从到北京入职以来就再也没有接触MVC,很多都已经淡忘了,最近一直在看knockout.js 和webAPI,本来打算采用MVC+k ...
- MVC中利用knockout.js实现动态uniqueId
题目比较拗口,但是这篇文章确实直说这一点. knockout.js是一个JS库,它的官网是http://knockoutjs.com/ 这篇文章的重点是knockout在工作的一个功能中的应用.最终效 ...
随机推荐
- Java反编译工具CFR,Procyon简介
Java反编译工具有很多,个人觉得使用最方便的是jd-gui,当然jad也不错,jd-gui主要提供了图形界面,操作起来很方便,但是jd-gui很久没有更新了,java 7出来很久了,jd-gui在反 ...
- Gradle语法基础解析
在从ADT转移到AndroidStudio下开发,必然会遇到Gradle脚本打包的问题.看懂一个脚本最基本的前提就是了解它的语法,我在转移开发环境的过程中,也开始接触学习Gradle,在此做了一些总结 ...
- 【LINK】手机Web开发框架
LINK : http://www.oschina.net/project/tag/322/mobile-web AmazeUI : http://amazeui.org/
- 关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的
最近在做数据从Excel批量导入MSSQL时,传统的是使用Insert Into Table方法,不过这个方便比较慢 通过使用 SqlBulkCopy 可以批量导入到数据库. 默认批量导入数据库,需要 ...
- DatabaseMirroring搭建
1. 概述 数据库镜像维护一个数据库的两个副本,这两个副本必须驻留在不同的 SQL Server 数据库引擎 服务器实例上.通常,这些服务器实例驻留在不同位置的计算机上.启动数据库上的数据库镜像 ...
- [置顶] 不刷机让越狱后的iphone恢复出厂设置
iphone越狱后,设置里的清除所有内容和设置选项是不生效的,选上之后菊花转个不停,只能强制退出,还有白苹果的危险. 若想恢复出厂设置有两个办法: 一.刷机 最直接的办法,我觉得itunes配合ito ...
- [leetcode]Combinations @ Python
原题地址:https://oj.leetcode.com/problems/combinations/ 题意:组合求解问题. 解题思路:这种求组合的问题,需要使用dfs来解决. 代码: class S ...
- Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)
1下载hadoop 2安装3个虚拟机并实现ssh免密码登录 2.1安装3个机器 2.2检查机器名称 2.3修改/etc/hosts文件 2.4 给3个机器生成秘钥文件 2.5 在hserver1上创建 ...
- layer.tips定义弹出的宽度
layer.tips('xxx', '.onlinetest', { tips: [1, '#3595CC'], area: ['500px', 'auto'], time: 4000 });
- Spring(七):IOC&DI
什么是IOC? IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源. 而应用了IOC之后, ...