Knockout围绕三个核心功能构建:
* 可观测和依赖跟踪
* 声明性绑定
* 模板
在本节中,您将了解这三个选项中的第一个。但在此之前,让我们先来看看MVVM模式和视图模型的概念。
*****
# MVVM 和 View Models
模型-视图-模型(MVVM)是一种用于构建用户界面的设计模式。它描述了如何通过将潜在复杂的UI分为三个部分来保持其简单性:
模型:应用程序存储的数据。此数据表示业务域中的对象和操作(例如,可以执行资金转账的银行帐户),并且独立于任何UI。在使用KO时,您通常会对一些服务器端代码进行Ajax调用,以读取和写入存储的模型数据。
视图模型:UI上数据和操作的纯代码表示。例如,如果您正在实现一个列表编辑器,那么视图模型将是一个包含项目列表的对象,并公开用于添加和删除项目的方法。
请注意,这不是UI本身:它没有任何按钮或显示样式的概念。它也不是持久化数据模型——它保存用户正在处理的未保存数据。使用KO时,视图模型是纯JavaScript对象,不包含HTML知识。以这种方式保持视图模型的抽象可以使其保持简单,因此您可以管理更复杂的行为而不会迷失方向。
视图:表示视图模型状态的可见交互式UI。它显示来自视图模型的信息,向视图模型发送命令(例如,当用户单击按钮时),并在视图模型的状态更改时更新。
使用KO时,视图只是HTML文档,带有声明性绑定,将其链接到视图模型。或者,您可以使用使用视图模型中的数据生成HTML的模板。
要使用KO创建视图模型,只需声明任何JavaScript对象。例如:
```
var myViewModel = {
personName: 'Bob',
personAge: 123
};
```
然后可以使用声明性绑定创建此视图模型的非常简单的视图。例如,以下标记显示personName值:
`The name is <span data-bind="text: personName"></span>
`
**激活knockout**
数据绑定属性不是HTML的本机属性,尽管它完全正常(它在HTML5中严格兼容,并且不会导致HTML4出现问题,即使验证器会指出它是一个无法识别的属性)。但是由于浏览器不知道它的意思,所以需要激活Knockout使其生效。
要激活敲knockout,请将以下行添加到`<script>`块:
```
ko.applyBindings(myViewModel);
```
您可以将脚本块放在HTML文档的底部,也可以将其放在顶部,并将内容包装到DOM就绪的处理程序中,例如jQuery的$函数。
就是这样!现在,您的视图将显示为您编写了以下HTML:
`The name is Bob`
如果您想知道ko.applyBindings的参数是什么,
第一个参数表示要将哪个视图模型对象与它激活的声明性绑定一起使用
(可选)可以传递第二个参数,以定义要搜索文档的哪部分数据绑定属性。例如,`ko.applyBindings(myViewModel,document.getElementById('someElementId'))`。这将激活限制为ID为someElementId的元素及其子体,如果希望有多个视图模型并将每个视图模型与页面的不同区域关联,这将非常有用。
**Observables**
好的,您已经了解了如何创建基本视图模型以及如何使用绑定显示其属性之一。但是KO的一个关键好处是,当视图模型发生变化时,它会自动更新您的UI。KO如何知道视图模型的某些部分何时更改?答:您需要将您的模型属性声明为可观察的,因为这些是特殊的JavaScript对象,可以通知订阅者更改,并可以自动检测依赖关系。
例如,按如下方式重写前面的视图模型对象:
```
var myViewModel = {
personName: ko.observable('Bob'),
personAge: ko.observable(123)
};
```
您根本不必更改视图-相同的数据绑定语法将继续工作。不同之处在于它现在能够检测到变化,一旦检测到变化,它就会自动更新视图。
*****
读写Observables
并非所有浏览器都支持JavaScript getter和setter(*cough*IE*cough*),因此为了兼容性,ko.observable对象实际上是函数。
要读取可观察对象的当前值,只需调用不带参数的可观察对象。在本例中,`myViewModel.personName()`将返回“Bob”,`myViewModel.personAge()`将返回123。
要向可观察对象写入新值,请调用可观察对象并将新值作为参数传递。例如,调用`myViewModel.personName('Mary')`会将名称值更改为'Mary'。
要将值写入模型对象上的多个可观察属性,可以使用链接语法。例如,`myViewModel.personName('Mary').personAge(50)`将名称值更改为'Mary',年龄值更改为50。
可观察的全部要点是它们可以被观察到,也就是说,其他代码可以说它希望收到更改通知。这就是KO的许多内置绑定在内部所做的。因此,当您编写data bind=“text:personName”时,文本绑定注册自己,以便在personName更改时收到通知(假设它是一个可观察的值,现在是)。
当您通过调用`myViewModel.personName('Mary')`将名称值更改为'Mary'时,文本绑定将自动更新关联DOM元素的文本内容。这就是视图模型的更改自动传播到视图的方式。
- Magento概述
- 第一章:路线图
- 概述
- 前端技能
- 后端技能
- 第二章:Linux环境
- 1.安装虚拟机VirtualBox
- 2.创建虚拟机
- 3.安装Ubuntu系统
- Linux文件系统概述
- Linux常用操作命令
- 第三章:Docker专题
- Docker概述
- 1.基础
- 2.镜像
- 3.容器
- 4.容器互联
- 5.dockerfile
- 6.docker-compose
- 7.docker安装nginx
- 8.docker安装mysql
- 9.docker安装redis
- 10.docker安装php
- 11.docker配置nginx-php-mysql
- 12.docker-compose构建lamp
- 13.附录
- 第四章:LAMP环境
- Docker构建LAMP开发环境
- 一键安装LNMP/LAMP
- 第五章:Magento安装
- Magento环境要求
- Docker安装Magento
- 填充网站首页、分类、商品等
- 第六章:Linux开发模式
- 编辑器vscode及插件
- 开发模式之SSH
- 开发模式之SFTP
- 开发模式之git
- 第七章:Magento架构
- 架构概述
- 文件目录结构
- 数据库表解析之EAV
- Magento命令行
- 第八章:模块结构解析
- 模块目录结构
- 配置文件之env.php
- 配置文件-routes.xml
- 配置文件之module.xml
- 配置文件之webapi.xml
- 配置的方式及加载顺序
- mvc之controller
- mvc之model
- mvc之block
- mvc之模板
- api概述
- 第九章:自定义模块
- 自定义模块概述
- 建立模块
- 注册模块
- 创建控制器
- 创建Block
- 创建模板
- Model-Collection-ResourceModel
- 添加后台菜单
- 第十章:重写(Override)
- 重写概述
- 布局文件详解
- 定位布局文件
- 重写Controller
- 重写Template
- 重写Block
- 重写Model
- 重写其它类
- 第十一章:小部件(Widget)
- 1.Widget概述
- 2.Widget在CMS页面的应用
- 3.自定义一个Widget
- 4.Widget添加到前台页面
- 第十二章:主题(Theme)
- 主题概述
- 1.创建新的主题
- 2.添加全局css文件
- 3.模板分离到主题
- 4.主题模板与javascript
- 5.magento封装的js写法
- 6.layout布局解析
- 7.创建移动端主题
- 第十三章:Template专题
- 模板的指定
- 自定义模板
- 模板重写的规则
- 第十四章:Javascript专题
- magento中的javascript
- requirejs语法
- js的调用和初始化
- js的重写和扩展
- javascript使用mixins
- 第十五章:Knockoutjs专题
- knockoutjs的应用
- knockout简介
- Observables
- Observable Arrays
- Computed Observables
- Bindings(绑定)
- Visible和hidden绑定
- Text绑定
- html绑定
- class和css绑定
- style绑定
- attr绑定
- 表单-click绑定
- 表单-submit绑定
- 表单-value值绑定
- 表单-textInput绑定
- 表单-checked绑定
- 表单-options绑定
- data-bind语法
- binding上下文
- 第十六章:Checkout专题
- 结算页面概述
- 添加新的结帐步骤
- 添加自定义支付方式
- 结算前添加自定义验证
- 添加自定义配送方式
- 添加自定义配送验证
- 为邮政编码添加掩码
- 为字段添加自定义模板
- 结账页面添加新的input
- 在地址表单中添加字段
- 添加自定义配送地址
- 结算页面其它字段修改
- 自定义运输方式列表
- 线下支付方式添加字段
- 第十七章:实战案例解析
- 从零开发一个模块
- 1.需求分析
- 2.数据表与数据填充
- 3.建立module
- 4.路由
- 5.控制器
- 6.创建Block
- 7.创建布局
- 8.建立模板
- 9.建立Model层
- 10.查询数据
- 11.完善模板
- 12.小结
- 定制我的订单页面
- 1.需求分析
- 2.新建模块
- 3.重写:布局文件
- 4.Block文件
- 5.模板文件
- 6.添加css文件
- 7.测试定制结果
- 添加系统配置模块
- 1.需求分析
- 2.后台实现
- 3.前台实现
- 第三方登录到magento
- 1.需求分析
- 2.登录页表单
- 3.建立module
- 4.建立控制器-后端登录逻辑
- 5.建立控制器-登录中间页
- 6.建立中间页的layout文件
- 7.建立block文件
- 8.建立登录中间页模板
- 9.第三方登录扩展
- 保留心愿单商品
- 1.需求分析
- 2.Plugin机制-拦截器
- 3.心愿单修改示例
- 创建订单流程及扩展
- 1.需求分析
- 2.创建订单流程追踪
- 3.重写
- 用户注册添加字段
- 1-需求分析
- 2-功能实现
- 第十八章:RestApi专题
- webapi概述
- 如何访问一个api
- swagger介绍
- 将services配置为webapi
- 配置api示例
- 设置自定义路由
- 第十九章:设计模式专题
- 设计模式概述
- 创建型模式
- 工厂方法
- 抽象工厂
- 生成器
- 原型
- 单例
- 结构型模式
- 适配器
- 桥接
- 组合
- 装饰
- 外观
- 享元
- 代理
- 行为模式
- 责任链
- 命令
- 迭代器
- 中介者
- 备忘录
- 观察者
- 状态
- 策略
- 模板方法
- 访问者
- 第二十章:性能最佳实践
- 本章概述
- 硬件推荐
- 软件推荐
- 架构参考
- 开发环境建议
- 配置最佳实践
- 部署流程
- 高级设置
- 附录1:常用代码及问题整理
- 权限报错问题
- Magento定时任务
- Magento开发基础篇一
- Magento开发基础篇二
- Magento之CRUD
- Magento中获取各种url的方法
- Redis存储Session和缓存
- 发送邮件配置
- 检测用户登录信息
- 获取env.php中配置的变量
- 模板中获取当前页面url
- 获取用户默认配送地址
- Magento系统问题整理
- 结算页面不能选择账单地址
- 我应该执行什么命令?
- 追代码打印sql
- 忘记后台密码怎么办?
- 附录2:多语言应用
- 多语言概述
- 日语翻译引擎
- 附录3:插件安装与GMO
- 安装插件的方法
- GMO支付插件
- 附录4:Elasticsearch搜索和分词
- ElasticSearcch配置与安装
- ES实现搜索日语分词