这一教程中你将会体验到一些用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. 【原生JS】进阶最后一个编程篇(与之前的选项卡不同的做法)

    完成效果图: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  2. Java反射机制(四):动态代理

    一.静态代理 在开始去学习反射实现的动态代理前,我们先需要了解代理设计模式,那何为代理呢? 代理模式: 为其他对象提供一种代理,以控制对这个对象的访问. 先看一张代理模式的结构图: 简单的理解代理设计 ...

  3. 洛谷P2672 推销员 题解 贪心

    题目链接:https://www.luogu.org/problem/P2672 这道题目是贪心,贪心的思想是: 选择 \(m\) 户人家的最大疲劳值应该是以下两种方案中的较大值: 方案一:选择 \( ...

  4. Python 基础课程大纲

      c0102_变量及数据类型.ipynb 1.数据类型概述 Python标准数据类型:Numbers数字,String字符串,List列表,Tuple元祖,Dici字典.布尔类型 # Numbers ...

  5. AWS Credentials 使用

    AWS的文档系统真是烂到家了!!!!! To connect to any of the supported services with the AWS SDK for Java, you must ...

  6. linux scull 中的读写代码

    读和写方法都进行类似的任务, 就是, 从和到应用程序代码拷贝数据. 因此, 它们的原型 相当相似, 可以同时介绍它们: ssize_t read(struct file *filp, char   u ...

  7. Linux下tomcat启动成功但是Windows打不开tomcat网址

    前提条件: 1.Linux和Windows都可以相互ping通. 2.Linux下tomcat可以启动,并且在Linux下可以访问8080 出现的问题: 当我在Windows下访问时,无法连接或者出现 ...

  8. 2018-2-13-C#-解析-sln-文件

    title author date CreateTime categories C# 解析 sln 文件 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...

  9. 【t050】方程求解

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 要求Xi(i = 1,2,3,4)是一个[-T..T]中的整数,满足方程AX1 + BX2 + CX3 ...

  10. ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(6)

    快过年了,公司事情忙,好几天没有继续写博客,今天开始写账户模块系统登录,账户管理以及登录日志, 首先新建登录日志数据表: USE [MVCSystem] GO /****** Object: Tabl ...