学习笔记 - 数据绑定之knockout
参考:
http://www.cnblogs.com/TomXu/archive/2011/11/21/2257154.html
http://knockoutjs.com/documentation/introduction.html
复习:AngularJS的数据绑定
- 显示文本
<p>{{greeting}}</p>
<!-- 或者 -->
<p ng-bind=”greeting”></p>
- 表单输入
<form ng-controller=”SomeController”>
<input type=”checkbox” ng-model=”youCheckedIt”>
</form>
- 列表
<ul ng-controller=’StudentController’>
<li ng-repeat=’student in students’>
<a href=’/student/view/{{student.id}}’>{{student.name}}</a>
</li>
</ul>
- 表格
<table ng-controller=’AlbumController’>
<tr ng-repeat=’track in album’>
<td>{{$index+1}}</td>
<td>{{track.name}}</td>
<td>{{track.duration}}</td>
</tr>
</table>
使用$watch监控数据模型的变化
Knockout基础学习
示例代码出现错误,显示jquery-tmpl版本太久,参考解决办法。jquery.tmpl.js的下载地址:
https://raw.githubusercontent.com/BorisMoore/jquery-tmpl/master/jquery.tmpl.js
https://github.com/BorisMoore/jquery-tmpl
库的在线引用地址:
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" src="./jquery.tmpl.js"></script>
<script type="text/javascript" src="http://knockoutjs.com/downloads/knockout-latest.js"></script>
入门
重要概念:
- 声明式绑定
- UI界面自动刷新
- 依赖跟踪
- 模板
启用绑定
ko.applyBindings(viewModel)
数据模型
var viewModel = {
chosenMeal: ko.observable(availableMeals[0])
}
数据
var availableMeals = [
{ mealName: 'Standard', description: 'Dry crusts of bread', extraCost: 0 },
{ mealName: 'Premium', description: 'Fresh bread with cheese', extraCost: 9.95 },
{ mealName: 'Deluxe', description: 'Caviar and vintage Dr Pepper', extraCost: 18.50 }
];
使用绑定,写变量
Chosen meal: <select data-bind="options: availableMeals,
optionsText: 'mealName',
value: chosenMeal"></select>
使用绑定,读变量,并作为参数提供给函数
<p>
You've chosen:
<b data-bind="text: chosenMeal().description"></b>
(price: <span data-bind='text: formatPrice(chosenMeal().extraCost)'></span>)
</p>
<script>
function formatPrice(price) {
return price == 0 ? "Free" : "$" + price.toFixed(2);
}
</script>
Observables 可观察变量
概念
observables, Dependent Observables, Observable Array
核心功能
observables 可观察变量 Dependency tracking 依赖跟踪
declarative bindings 显式绑定
templating 模板
View-Model 视图模型
激活Knockout
ko.applyBindings(myViewModel, document.getElementById('someElementId'))
可观察变量,声明
var myViewModel = {
personName: ko.observable('Bob'),
personAge: ko.observable(123)
};
可观察变量,读写
读:myViewModel.personAge()
写:myViewModel.personName('Mary'),支持链式语法
绑定,data-bind,注册到可观察变量
可观察变量,显示订阅
var subscription = myViewModel.personName.subscribe(function (newValue) { /* do stuff */ });
// ...then later...
subscription.dispose(); // I no longer want notifications
依赖可观察变量
var viewModel = {
firstName: ko.observable('Bob'),
lastName: ko.observable('Smith')
};
viewModel.fullName = ko.dependentObservable(function () {
return this.firstName() + " " + this.lastName();
}, viewModel);
从依赖变量写入可观察变量
viewModel.fullName = ko.dependentObservable({
read: function () {
return this.firstName() + " " + this.lastName();
},
write: function (value) {
var lastSpacePos = value.lastIndexOf(" ");
if (lastSpacePos > 0) { // Ignore values with no space character
this.firstName(value.substring(0, lastSpacePos)); // Update "firstName"
this.lastName(value.substring(lastSpacePos + 1)); // Update "lastName"
}
},
owner: viewModel
});
使用依赖变量数组observable array
var myObservableArray = ko.observableArray(); // Initially an empty array
myObservableArray.push('Some value'); // Adds the value and notifies observers // This observable array initially contains three objects
var anotherObservableArray = ko.observableArray([
{ name: "Bungle", type: "Bear" },
{ name: "George", type: "Hippo" },
{ name: "Zippy", type: "Unknown" }
]);
js等价读取信息:length, indexOf, slice
js数组等价操作:pop, push, shift, unshift, reverse, sort, splice
特殊操作:remove, removeAll
绑定语法一
visible: 绑定到DOM元素,控制元素是否显示
text: 控制元素的文本值
html: 控制元素显示的HTML值
css: 添加或删除一个或多个CSS class到DOM元素上
style: 添加或删除一个或多个DOM元素上的style值
attr: 提供了一种方式可以设置DOM元素的任何属性值
绑定语法二
click
event, 例如keypress, mouseover, mouseout
submit
enable
disable
绑定语法三
value, <input>, <select>, <textarea>
checked, <input type=’checkbox’>, <input type=’radio’>
options, <select>, <select size=’6’>
selectedOptions, multi-select
uniqueName
模板绑定
使用jquery.tmpl,你可以使用任何你模板引擎支持的语法。jquery.tmpl执行如下语法:
${ someValue } — 参考文档
{{html someValue}} — 参考文档
{{if someCondition}} — 参考文档
{{else someCondition}} — 参考文档
{{each someArray}} — 参考文档
创建自定义绑定
创建自定义绑定要在ko.bingdinghandlers中注册你的绑定名称,完成初始动作和更新动作
ko.bindingHandlers.yourBindingName = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
// This will be called when the binding is first applied to an element
// Set up any initial state, event handlers, etc. here
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
// This will be called once when the binding is first applied to an element,
// and again whenever the associated observable changes value.
// Update the DOM element based on the supplied values here.
}
};
例如,我一般通过visible绑定控制一个元素的可见性,但是你希望更进一步能够动画显示这种转换。你希望元素根据一个绑定值slide in和slide out,你可以自定义一个绑定,在其中使用jQuery的 slideUp/slideDown功能。
ko.bindingHandlers.slideVisible = {
update: function(element, valueAccessor, allBindings) {
// First get the latest data that we're bound to
var value = valueAccessor();
// Next, whether or not the supplied model property is observable, get its current value
var valueUnwrapped = ko.unwrap(value);
// Grab some more data from another binding property
var duration = allBindings.get('slideDuration') || 400; // 400ms is default duration unless otherwise specified
// Now manipulate the DOM element
if (valueUnwrapped == true)
$(element).slideDown(duration); // Make the element visible
else
$(element).slideUp(duration); // Make the element invisible
}
};
这样使用绑定:
<div data-bind="slideVisible: giftWrap, slideDuration:600">You have selected the option</div>
<label><input type="checkbox" data-bind="checked: giftWrap" /> Gift wrap</label> <script type="text/javascript">
var viewModel = {
giftWrap: ko.observable(true)
};
ko.applyBindings(viewModel);
</script>
加载或保存JSON数据
加载或保存数据:例如使用jQuery的$.getJSON, $.post, $.ajax
转化ViewModel数据到JSON格式,有时需要json2.js类库
ko.toJS 转化为JS对象
ko.toJSON 转化为JSON字符串
使用JSON更新ViewModel数据
手动方式
// 载入冰解析JSON
var someJSON = /* 使用你期望的任何方法获取JSON */
var parsed = JSON.parse(someJSON); // 更新view model属性
viewModel.firstName(parsed.firstName);
viewModel.pets(parsed.pets);
或者使用 knockout.mapping
使用Mapping插件
var viewModel = ko.mapping.fromJS(data); //创建ViewModel
ko.mapping.fromJS(data, viewModel); //更新ViewModel
用法:
key, create, update, ignore, include, copy
两种方式创建viewModel
var viewModel = {
firstName: ko.observable("Planet"),
lastName: ko.observable("Earth")
};
viewModel.fullName = ko.dependentObservable({
read: function() {
return this.firstName() + " " + this.lastName();
},
write: function(value) {
var lastSpacePos = value.lastIndexOf(" ");
if (lastSpacePos > 0) { // Ignore values with no space character
this.firstName(value.substring(0, lastSpacePos)); // Update "firstName"
this.lastName(value.substring(lastSpacePos + 1)); // Update "lastName"
}
},
owner: viewModel
});
var clickCounterViewModel = function() {
this.numberOfClicks = ko.observable(0);
this.registerClick = function() {
this.numberOfClicks(this.numberOfClicks() + 1);
}
this.hasClickedTooManyTimes = ko.dependentObservable(function() {
return this.numberOfClicks() >= 3;
}, this);
};
ko.applyBindings(new clickCounterViewModel());
应用举例
常用的控件

源代码:视图
<div class="readout">
<h3>What's in the model?</h3>
<table>
<tr>
<td class="label">Text value:</td>
<td data-bind="text: stringValue"></td>
</tr>
<tr>
<td class="label">Password:</td>
<td data-bind="text: passwordValue"></td>
</tr>
<tr>
<td class="label">Bool value:</td>
<td data-bind='text: booleanValue() ? "True" : "False"'></td>
</tr>
<tr>
<td class="label">Selected option:</td>
<td data-bind="text: selectedOptionValue"></td>
</tr>
<tr>
<td class="label">Multi-selected options:</td>
<td data-bind="text: multipleSelectedOptionValues"></td>
</tr>
<tr>
<td class="label">Radio button selection:</td>
<td data-bind="text: radioSelectedOptionValue"></td>
</tr>
</table>
</div> <h3>HTML controls</h3>
<table>
<tr>
<td class="label">Text value (updates on change):</td>
<td><input data-bind="value: stringValue" /></td>
</tr>
<tr>
<td class="label">Text value (updates on keystroke):</td>
<td><input data-bind='value: stringValue, valueUpdate: "afterkeydown"' /></td>
</tr>
<tr>
<td class="label">Text value (multi-line):</td>
<td><textarea data-bind="value: stringValue"> </textarea></td>
</tr>
<tr>
<td class="label">Password:</td>
<td><input type="password" data-bind="value: passwordValue" /></td>
</tr>
<tr>
<td class="label">Checkbox:</td>
<td><input type="checkbox" data-bind="checked: booleanValue" /></td>
</tr>
<tr>
<td class="label">Drop-down list:</td>
<td><select data-bind="options: optionValues, value: selectedOptionValue"></select></td>
</tr>
<tr>
<td class="label">Multi-select drop-down list:</td>
<td><select multiple="multiple" data-bind="options: optionValues, selectedOptions: multipleSelectedOptionValues"></select></td>
</tr>
<tr>
<td class="label">Radio buttons:</td>
<td>
<label><input type="radio" value="Alpha" data-bind="checked: radioSelectedOptionValue" />Alpha</label>
<label><input type="radio" value="Beta" data-bind="checked: radioSelectedOptionValue" />Beta</label>
<label><input type="radio" value="Gamma" data-bind="checked: radioSelectedOptionValue" />Gamma</label>
</td>
</tr>
</table>
源代码:View Model
var viewModel = {
stringValue : ko.observable("Hello"),
passwordValue : ko.observable("mypass"),
booleanValue : ko.observable(true),
optionValues : ["Alpha", "Beta", "Gamma"],
selectedOptionValue : ko.observable("Gamma"),
multipleSelectedOptionValues : ko.observable(["Alpha"]),
radioSelectedOptionValue : ko.observable("Beta")
};
ko.applyBindings(viewModel);
学习笔记 - 数据绑定之knockout的更多相关文章
- knockoutJS学习笔记03:knockout简介
通常来说,前端的维护难度是比较大的,特别是脚本,虽然像jquery这样的库可以帮助我们减少很多代码,但在稍微复杂的情况下,还是会产生有很多代码.上一篇介绍了模板引擎jsRender,它可以帮我们快速生 ...
- AngularJs学习笔记-数据绑定、管道
数据绑定.管道 (1)数据绑定(Angular中默认是单向绑定) 1.[]方括号 可以用于子组件传值 由于是单向绑定,所以当子组件中的iStars属性发生改变时,不会影响到父组件中product.ra ...
- WPF学习笔记 - 数据绑定(在代码中)
在程序代码里,有两种设置绑定的方法,一种是调用FrameworkElement或FrameContentElement对象的SetBinding实例方法. 例如: Public MainWindow( ...
- Spring 学习笔记 数据绑定,校验,BeanWrapper 与属性编辑器
Spring 数据绑定,校验,BeanWrapper,与属性编辑器 Data Binding 数据绑定(Data binding)非常有用,它可以动态把用户输入与应用程序的域模型(或者你用于处理用户输 ...
- knockout学习笔记目录
关于knockout学习系列的文章已经写完,这里主要是做个总结,并且将目录罗列出来,方便查看.欢迎各位大神拍砖和讨论. 总结 kncokout是一个轻量级的UI类库,通过MVVM模式使前端的UI简单话 ...
- Knockout.js快速学习笔记
原创纯手写快速学习笔记(对官方文档的二手理解),更推荐有时间的话读官方文档 框架简介(Knockout版本:3.4.1 ) Knockout(以下简称KO)是一个MVVM(Model-View-Vie ...
- NGUI 学习笔记实战之二——商城数据绑定(Ndata)
上次笔记实现了游戏商城的UI界面,没有实现动态数据绑定,所以是远远不够的.今天采用NData来做一个商城. 如果你之前没看过,可以参考上一篇博客 NGUI 学习笔记实战——制作商城UI界面 ht ...
- SpringMVC:学习笔记(5)——数据绑定及表单标签
SpringMVC——数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...
- 微信小程序学习笔记二 数据绑定 + 事件绑定
微信小程序学习笔记二 1. 小程序特点概述 没有DOM 组件化开发: 具备特定功能效果的代码集合 体积小, 单个压缩包体积不能大于2M, 否则无法上线 小程序的四个重要的文件 *js *.wxml - ...
随机推荐
- Nginx 配置指令location 匹配符优先级和安全问题【转】
Nginx配置指令location匹配符优先级和安全问题 使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";&q ...
- [ActionScript 3.0] AS3动画类Tweener中滤镜的运用
package { import caurina.transitions.Tweener; import caurina.transitions.properties.FilterShortcuts; ...
- Aspose.Cells单元格转换为数字格式
需要在两个地方设置 //Adding a numeric value to "A2" cell "; worksheet.Cells["A2"].Pu ...
- java 对象类型的转换
import com.java.charpt05.NewStr; class Quadrangle{ public static void draw(Quadrangle q) { ...
- checkbox与文字的间距
1. checkbox在更换了图片后, 与文字的距离有问题, 建议修改background为@null, 去除占据的位置. 2. checkbox的paddingleft可以控制图片和文字的间距.
- 部署windows服务
(1) cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319(2) InstallUtil.exe D:\SVN\zhongchao\开发\WeiXin ...
- iOS开发-文件管理(一)
iOS开发-文件管理(一) 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立.封闭.安全的空间,叫做沙盒.它一般存放着程序包文件(可执行文件).图片.音频.视频.pli ...
- jmeter随笔(29)-关于自己的jar包和beanshell的使用
点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...
- opencv_协方差矩阵与协方差讲解
统计学的基本概念 学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差.首先我们给你一个含有n个样本的集合,依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧 ...
- Django中级篇(上)
Form验证 django中的Form一般有两种功能: 输入html-----------不能你自己写一些标签,而帮你自动生成 验证用户输入-------将用户验证信息保存起来,可以传到前段 #!/u ...