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-MOLDE

<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?

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

时间: 2024-09-30 15:07:26

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

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

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Basic DataGrid - jQuery EasyUI Demo</title><link rel="stylesheet" type="text/css" href="easyui.css"><link rel=&quo

4.Knockout.Js官网学习(事件绑定)

前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h2>ClickBind</h2> <div> You've clicked <span data-bind="text: numberOfClicks"></span> times <button data-bind="

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

本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knockout.js 学习体验之旅](1)ko初体验 [Knockout.js 学习体验之旅](2)花式捆绑 [Knockout.js 学习体验之旅](3)模板绑定 模板引擎 页面是由数据和HTML组件构成的,如何将数据嵌入到HTML组件里面呢?一个比较好的选择是使用模板技术. 回顾下第一篇([Knock

通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用

REFERENCE FROM : http://www.cnblogs.com/artech/archive/2012/07/04/Knockout-web-api.html 较之面向最终消费者的网站,企业级Web应用对用户体验的要求要低一些.不过客户对“用户体验”的要求是“与日俱增”的,很多被“惯坏了”的用户已经不能忍受Postback带来的页面刷新,所以Ajax在企业级Web应用中得到了广泛的应用.企业级Web应用的一个特点是以“数据处理”为主,所以“面向绑定”的Knockout.js 是一

MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js 概念摘录

转自:http://www.cnblogs.com/xishuai/p/mvc-mvp-mvvm-angularjs-knockoutjs-backbonejs-reactjs-emberjs-avalonjs.html MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式. 交互方式(所有通信都是单向的): View 传送指令到 Contro

1.Knockout.Js官网学习(简介)

前言 最近一段时间在网上经常看到关于Knockout.js文章,于是自己就到官网看了下,不过是英文的,自己果断搞不来,借用google翻译了一下.然后刚刚发现在建立asp.net mvc4.0的应用程序的时候,建完之后我直接在项目的Scripts中看到了这两个js类库,用谷歌翻译看了下官网,Ko的实现原理是MVVM,比MVC高级一些. 简介MVVM模式 MVVM是Model-View-ViewModel的简写. WPF的数据绑定与Presentation Model相结合是非常好的做法,使得开发

在ASP.NET MVC中使用Knockout实践09,自定义绑定

Knockout真正强大之处在于绑定机制,通过data-bind属性值体现绑定,不仅可以绑定值,还可以绑定事件,甚至可以自定义绑定. 从一个例子看Knockou的绑定机制 假设想给一个button元素变成jQuery UI的button,大致这样做: <button id="btn">点我</button> $('#btn').button( icons: { primary: 'ui-icon-gear' } ); "他山之石,可以攻玉",

7.Knockout.Js(Mapping插件)

前言 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些observable值改变的时候,这些UI元素就会自动更新. 使用mapping要引用的Js文件https://github.com/SteveSanderson/knockout.mapping/tree/master/build/output. 手工mapping 显示当前服务器时间和你网站上的当

原生js实现数据双向绑定

最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里 缺点:一旦HTML代码生成就没有办法改变,如果有新数据重新传入,就必须重新把模板和数据整合到一起插入到文档流中 数据双向绑定 数据模型和视图之间的双向绑定,用户在视图上的修改会自动同步到数据模型中,同样的,如果数据模型中的值发生变化,也会同步到视图中去