这一教程中你将会体验到一些用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 UI

function AppViewModel() {

    this.firstName = "Bert";

    this.lastName = "Bertington";

}

 

// Activates knockout.js

ko.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 UI

function AppViewModel() {

    this.firstName = ko.observable("Bert");

    this.lastName = ko.observable("Bertington");

    this.fullName = ko.computed(function() {

        return this.firstName() + " " + this.lastName();    

    }, this);

}

 

// Activates knockout.js

ko.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 value

        this.lastName(currentVal.toUpperCase()); // Write back a modified value

    };    

}

 

// Activates knockout.js

ko.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官网教程学习(一)的更多相关文章

  1. 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群

    在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...

  2. 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ

    鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...

  3. [pytorch] 官网教程+注释

    pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transform ...

  4. Knockoutjs官网翻译系列(一)

    最近马上要开始一个新项目的研发,作为第一次mvvm应用的尝试,我决定使用knockoutjs框架.作为学习的开始就从官网的Document翻译开始吧,这样会增加印象并加入自己的思考,说是翻译也并不是纯 ...

  5. Unity 官网教程 -- Multiplayer Networking

    教程网址:https://unity3d.com/cn/learn/tutorials/topics/multiplayer-networking/introduction-simple-multip ...

  6. MongoDB 官网教程 下载 安装

    官网:https://www.mongodb.com/ Doc:https://docs.mongodb.com/ Manual:https://docs.mongodb.com/manual/ 安装 ...

  7. Spark官网资料学习网址

    百度搜索Spark: 这一个是Spark的官网网址,你可以在上面下载相关的安装包等等. 这一个是最新的Spark的文档说明,你可以查看如何安装,如何编程,以及含有对应的学习资料.

  8. 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装

    一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...

  9. 学习技巧-如何在IBM官网寻找学习资料

    场景:最近看招聘职位TM1比较火,于是就想找一下Cognos TM1的资料来拜读一下,然后论坛都是大价钱的金币,迫于无奈只好来到IBM的官网来寻求指导 http://www.ibm.com/us/en ...

随机推荐

  1. POJ 2752 Seek the Name, Seek the Fame next数组理解加深

    题意:给你一个字符串,寻找前缀和后缀相同的子串(包括原串). 从小到大排列输出其子串的长度 思路:KMP  next 数组应用. 其实就是一个数学推导过程. 首先由next数组 可知s(ab) = s ...

  2. Python--day22--面向对象的交互

    Python里面自带的类和对象: 类名的作用: 类里面的与属性相关的对象self的运用: 实例化:就是创建一个对象 调用方法,类名.方法名(对象名) 执行步骤: 简写:alex.walk()等价于Pe ...

  3. Codeforces Round #177 (Div. 1 + Div. 2)

    A. Polo the Penguin and Segments 模拟. B. Polo the Penguin and Matrix 每个数字模d余数必须一样. 枚举结果,可计算操作次数,取最小. ...

  4. H3C 不同匹配顺序导致结果不同

  5. python编程之进程

    进程:运行中的程序 进程和操作系统的关系:进程是操作系统调度和资源分配的最小单位,是操作系统的结构基础. 那么为什么要有进程呢? 程序在运行时,会使用各种硬件资源,如果他们之间没有界限,那么程序之间的 ...

  6. java TreeSet的排序之定制排序

    TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2 ...

  7. Intellij IDEA 如何使用Jrebel热部署

    My Jrebel 已经不再提供免费使用了,或使用破解版Jrebel 或可以移步至 HotSwapAgent,或使用破解的Jrebel. 一个java web项目,在写的过程中我们需要不断调试,如果没 ...

  8. linux进程延迟

    #include <linux/wait.h> long wait_event_interruptible_timeout(wait_queue_head_t *q, condition, ...

  9. POJ 3311 Hie with the Pie 兼 Codevs 2800 送外卖(动态规划->TSP问题)

    Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possi ...

  10. java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity

    今天想把ssh整合的代码跑起来,控制台就一直在报错,搞了半天!!! Hibernate: select computer0_.computerId as computer1_0_, computer0 ...