这一教程中你将会体验到一些用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. 深入Java线程管理(一):线程的实现方式

    Java的线程实现方式一共有三种,继承Thread.实现Runable接口,实现Callable接口.不过实现Runnable接口与实现Callable接口的方式基本相同,只是Callable接口里定 ...

  2. Vue 列表动画实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 4-4 Selector有一个方法可以获取Selector中的文本内容---extract()

    ####### 例如: response.xpath('//div[@class ="entry-header"]/h1/text()').extract()

  4. linux平台依赖性

    每个电脑平台有其自己的特点, 内核设计者可以自由使用所有的特性来获得更好的性能. in the target object file ??? 不象应用程序开发者, 他们必须和预编译的库一起连接他们的代 ...

  5. 【t056】智力问答(multiset做法)

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 新年联欢会上,G.Sha负责组织智力问答节目.G.Sha建立了一个很大很大的超级题库,并衡量了每道题的 ...

  6. 移动端开发touchstart,touchmove,touchend事件详解和项目

    移动端开发touchstart,touchmove,touchend事件详解和项目 最近在做移动端的开发,在一个“服务商管理”页面使用到了触摸事件"touchstart",&quo ...

  7. .Net Core 3.0 发布为单独的可执行文件

    dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true

  8. python常见关键字的使用

    常见关键字 在循环中常见的关键字使用方法 continue:结束本次循环,继续执行下一次循环 break:跳出一个循环或者结束一个循环 例 使用用户名密码登录(有三次机会)count=0while c ...

  9. vue文章学习路线

    vue学习笔记(一)入门 Vue实现简单的购物车功能 vue学习笔记(二)vue的生命周期和钩子函数 使用webstorm搭建vue-cli项目 vue-cli项目中引入第三方插件 vue-cli项目 ...

  10. Selenium3+Python3环境搭建

    安装python 官网直接下载当前最新版的python Python官网地址:https://www.python.org/ 百度搜索Python3.6安装步骤 Python安装步骤:自行百度,暂不提 ...