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實現搜索日語分詞