KnockoutJs官网教程学习(一)
这一教程中你将会体验到一些用knockout.js和Model-View-ViewModel(MVVM)模式去创建一个Web UI的基础方式。
将学会如何用views(视图)和declarative bindings(声明的绑定信息)去定义一个UI的展现方式,它的数据和行为使用的ViewModels(视图模型)和observables(观测),以及如何一切自动保持同步得益于Knockout的依赖跟踪(甚至数据的任意级联链)。
本章目录:
1) 在视图中使用绑定
2) 使数据可进行编辑
3) 定义计算值
4) 添加更多规则
1、在视图中使用绑定。
例如有一个Person视图模型,另外还需要有个视图页面用来展现Person的数据。
首先我们定义一个knockout的js视图模型
// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UIfunction AppViewModel() {this.firstName = "Bert";this.lastName = "Bertington";}// Activates knockout.jsko.applyBindings(new AppViewModel());
这里我们需要注意的是我们定义好了一个ViewModel对象后需要调用Knockout的applyBindings方法来绑定视图信息,让当前页面知道我们可以在这个页面上使用这个ViewModel对象来绑定控件值。
然后我们来编写需要展现信息的页面代码
<p>First name: <strong data-bind="text:firstName">todo</strong></p><p>Last name: <strong data-bind="text:lastName">>todo</strong></p>运行后我们会发现页面上的First Name和Last Name 分别从原来的todo变成了我们js中定义的字段值了。因为data-bind属性让knockout声明的ViewModel属性与DOM元素关联起来,我们仅仅使用text去给DOM元素指定文本内容即可。
2、使数据可进行编辑
实际的开发过程中我们并不仅限于将静态的数据进行展示,更多时候我们需要对数据进行编辑。下面我们使用value绑定我们普通的input控件来对数据进行编辑。
<p>First name: <strong data-bind="text: firstName">todo</strong></p><p>Last name: <strong data-bind="text: lastName">todo</strong></p><p>First name: <input data-bind="value: firstName"/></p><p>Last name: <input data-bind="value: lastName"/></p>
经过上面的代码,我们已经能够在页面上对数据进行编辑了,但是编辑后我们并没有更新相应的字段值,实际上当我们编辑某一个文本框的时候就会更新相关ViewModel中的的字段值,由于ViewModel的属性值仅仅是字符串,无法通知任何人它的值改变了,因此UI中的值还是静态的。这就是为什么Knockout有一个observables的概念(当属性值改变时会自动通知)。这样我们就需要修改一下我们的ViewModel定义我们将ViewModel修改为一下来实现相关绑定字段的自动更新功能。
function AppViewModel() {this.firstName = ko.observable("Bert");this.lastName = ko.observable("Bertington");}
现在修改一下文本框中的数据,我们就可以很直观的看到上面绑定了字段的值会随着文本框内容的改变而改变了。
3、定义计算值
很多情况下,我们希望拼接或者转换多个值提供给其他控件,下面我们将定义一个FullName字段值为FirstName+” ”+LastName。
Knockout有一个computed属性的概念(observable类型(例如:改变时自动通知)并且他是基于其他observable字段值计算得出的)。
下面我们修改一下我们的ViewModel对象,增加一个FullName属性。
// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UIfunction AppViewModel() {this.firstName = ko.observable("Bert");this.lastName = ko.observable("Bertington");this.fullName = ko.computed(function() {return this.firstName() + " " + this.lastName();}, this);}// Activates knockout.jsko.applyBindings(new AppViewModel());
正如你看到的,我们on个过一个回传方法给computed指定了它的值应该如何进行计算,下面我们增加一个控件用来展现FullName字段。
<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p><p>First name: <input data-bind="value: firstName" /></p><p>Last name: <input data-bind="value: lastName" /></p><p>Full name: <strong data-bind="text: fullName"></strong></p>
现在运行后,编辑文本框你会发现页面上所有控件的值都和相关的数据保持同步。原因是得益于Knockout的自动依赖跟踪:最后一个控件的值依赖于FullName,而fullname依赖于firstName和lastName,无论是哪个通过文本框进行了修改。任何涉及到对象关联部分的操作都会影响到ViewModel对象和可见UI的变化。结果如下:
4、添加更多规则
在本节的最后,我们添加一个规则:点击一个button是将FullName修改为大写。
首先我们在ViewModel中添加一个capitalizeFullName方法用来实现这个规则。
function AppViewModel() {this.firstName = ko.observable("Bert");this.lastName = ko.observable("Bertington");this.fullName = ko.computed(function() {return this.firstName() + " " + this.lastName();}, this);this.capitalizeLastName = function() {var currentVal = this.fullName(); // Read the current valuethis.lastName(currentVal.toUpperCase()); // Write back a modified value};}// Activates knockout.jsko.applyBindings(new AppViewModel());
这里需要注意的是调用一个observable类型值得时候可以把它作为一个方法来调用,下面我们在页面上添加一个button通过click绑定来关联我们刚刚添加的ViewModel信息。
<p>First name: <strong data-bind="text: firstName"></strong></p><p>Last name: <strong data-bind="text: lastName"></strong></p><p>First name: <input data-bind="value: firstName" /></p><p>Last name: <input data-bind="value: lastName" /></p><p>Full name: <strong data-bind="text: fullName"></strong></p><button data-bind="click: capitalizeLastName">转换</button>
这样我们在点击转换的时候就实现了将FullName转换成大写了。
第一次发布博客感觉好正式,虽然只是将官网的教程进行了一下“汉化”,希望大家拍砖指正。
KnockoutJs官网教程学习(一)的更多相关文章
- 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群
在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...
- 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ
鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...
- [pytorch] 官网教程+注释
pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transform ...
- Knockoutjs官网翻译系列(一)
最近马上要开始一个新项目的研发,作为第一次mvvm应用的尝试,我决定使用knockoutjs框架.作为学习的开始就从官网的Document翻译开始吧,这样会增加印象并加入自己的思考,说是翻译也并不是纯 ...
- Unity 官网教程 -- Multiplayer Networking
教程网址:https://unity3d.com/cn/learn/tutorials/topics/multiplayer-networking/introduction-simple-multip ...
- MongoDB 官网教程 下载 安装
官网:https://www.mongodb.com/ Doc:https://docs.mongodb.com/ Manual:https://docs.mongodb.com/manual/ 安装 ...
- Spark官网资料学习网址
百度搜索Spark: 这一个是Spark的官网网址,你可以在上面下载相关的安装包等等. 这一个是最新的Spark的文档说明,你可以查看如何安装,如何编程,以及含有对应的学习资料.
- 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装
一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...
- 学习技巧-如何在IBM官网寻找学习资料
场景:最近看招聘职位TM1比较火,于是就想找一下Cognos TM1的资料来拜读一下,然后论坛都是大价钱的金币,迫于无奈只好来到IBM的官网来寻求指导 http://www.ibm.com/us/en ...
随机推荐
- X Samara Regional Intercollegiate Programming Contest
A. Streets of Working Lanterns - 2 对于每个括号序列,存在一个\(mv\),表示要接上这个序列至少需要\(-mv\)个左括号,同时处理出接上这个序列后,左括号数量的增 ...
- Python--day46--mysql存储过程(不常用)(包含防sql注入)
一.存储过程: 优点:只要传很少的数据到数据库就可以了 缺点:dba管理数据库的时候可能会对数据库进行了更改了那一坨sql语句. 二.创建存储过程: 1.简单 创建存储过程: Python中使用结果 ...
- electron-vue 窗口拖拽及自定义边框,及关闭缩小放大化方法
1.窗口的最小化按钮和关闭按钮以及标题栏自定义,不使用 electron 自身携带的原生标题栏 在src文件夹下main下index.js文件添加 mainWindow = new BrowserWi ...
- 9月29更新美版T-mobile版本iPhone7代和7P有锁机卡贴解锁方法
T版是块难解的砖头,之前一直没有找到稳定解锁办法,经过多次不写努力和实验,终于解决 不管是用超雪卡贴还是GPP卡贴,第一次先用连接WIFI激活手机! 注意:一定不要用ICCID通用激活,或者是TM ...
- linux 存取 I/O 内存
在一些平台上, 你可能逃过作为一个指针使用 ioremap 的返回值的惩罚. 这样的使用不 是可移植的, 并且, 更加地, 内核开发者已经努力来消除任何这样的使用. 使用 I/O 内 存的正确方式是通 ...
- 【codeforces 764A】Taymyr is calling you
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- dotnet 删除只读文件
如果直接通过 File.Delete 删除只读文件会出现没有权限提示,可以先设置文件不是只读然后删除文件 try { File.Delete(file); } catch (UnauthorizedA ...
- Sql Server知识点拨
一.Sql Server异常捕获try catch 二.集增加与修改的存储过程 三.显示某一列中有重复值的行 转载自:https://www.cnblogs.com/527289276qq/
- P4556 [Vani有约会]雨天的尾巴 (线段树合并)
P4556 [Vani有约会]雨天的尾巴 题意: 首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋 ...
- CentOS7.6部署k8s环境
CentOS7.6部署k8s环境 测试环境: 节点名称 节点IP 节点功能 K8s-master 10.10.1.10/24 Master.etcd.registry K8s-node-1 10.10 ...



