From 8c8830e1c400654493c1c41e7fa223c45d010bce Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Mon, 18 Apr 2022 22:07:30 +1000 Subject: [PATCH] Initial Commit --- ...ng_the_ui_automatically_with_knockoutjs.md | 45 +++++++++++ Home.md | 2 + imgs/7074OS_01_01.jpg | Bin 0 -> 50858 bytes tut-chap01.md | 70 ++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 1_refreshing_the_ui_automatically_with_knockoutjs.md create mode 100644 Home.md create mode 100644 imgs/7074OS_01_01.jpg create mode 100644 tut-chap01.md diff --git a/1_refreshing_the_ui_automatically_with_knockoutjs.md b/1_refreshing_the_ui_automatically_with_knockoutjs.md new file mode 100644 index 0000000..e359724 --- /dev/null +++ b/1_refreshing_the_ui_automatically_with_knockoutjs.md @@ -0,0 +1,45 @@ +# Chapter 1. Refreshing the UI Automatically with KnockoutJS + +KnockoutJS (ko) gives the ability to objects to become the nexus (comm center) between views (html) and models. + +It uses **declarative bindings** to associate DOM elements with model data. + +![MVVM-pattern diagram](imgs/7074OS_01_01.jpg) + +## Summary + +Objective of this chapter: Learn basic of Knockout + +App dev progress: +1. Create a simple form to add products to catalog +2. Learn how to manage observable collections and display them in a table +3. Develop a search functionality using computed observables + +What we learned: +* 3 important Knockout concepts: + * **View-model**: pure JS object that holds logic/data to represent stat of view + * **Models**: data from business domain + * **Views**: HTML/XML etc to display data +* KnockoutJS use observer pattern for synchronizing btw View-Model and View. (e.g. important methods used in View-Model js) + * `ko.observable` to manage variables + * `ko.observableArray`: to manage arrays + * `ko.computed`: respond to changes from observables + +## A real-world application - koCart + +User stories: +* User can view the invetory catalog +* User can search the catalog +* User can click a button to add items to catalog +* App allow add/update/delete from catalog +* User can add/update/delete items from cart +* Admin can update user's personal information + +3 parts in app: +* Catlog: contains and manage products +* Cart: calculate price of purchase/order +* Order, user can update personal info + +## The view-model + +**view-model** = pure code representation of the data and operations on UI (i.e. Control). It \ No newline at end of file diff --git a/Home.md b/Home.md new file mode 100644 index 0000000..2bbca1d --- /dev/null +++ b/Home.md @@ -0,0 +1,2 @@ +# Home + diff --git a/imgs/7074OS_01_01.jpg b/imgs/7074OS_01_01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be0911a9da19e9f72d140c4ad888cfcb3b7e6dd8 GIT binary patch literal 50858 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

NDfY`Y@3J>sP;_FfPDb}@ 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 O{mv&_-2nYP`JVtld?OkF literal 0 HcmV?d00001 diff --git a/tut-chap01.md b/tut-chap01.md new file mode 100644 index 0000000..e0f69e1 --- /dev/null +++ b/tut-chap01.md @@ -0,0 +1,70 @@ +# Tutorial 01 + +This tutorial follows **Chapter 01. Refreshing the UI Automatically with KnockoutJS** + +## A real-world application - koCart + +We want to learn KnockoutJS through building a web app + +Define user stories: +* The user should be able to view the catalog +* We should have the ability to search the catalog +* The user can click on a button to add items to the catalog +* The application will allow us to add, update, and delete items from the catalog +* The user should be able to add, update, and delete items from the cart +* We will allow the user to update his personal information +* The application should be able to calculate the total amount in the cart +* The user should be able to complete an order + +Web app consists of 3 parts: +* **catalog**: contains and manages all the products we have in the shop. +* **cart**: responsible for calculating the price of each line and the total amount of the order. +* **order**: user can update his personal information and confirm the order. + +## Installing components + +Objective: Setup dev environment for ko-cart + +Steps: +1. Download JS libraries: + 1. [Bootstrap](https://github.com/twbs/bootstrap/releases/download/v3.2.0/bootstrap-3.2.0-dist.zip) + 2. [jQuery](https://code.jquery.com/jquery-2.1.1.min.js) + 3. [KnockoutJS](http://knockoutjs.com/downloads/knockout-3.2.0.js) +2. Create folder `ko-cart` in repo +3. Create 3 subfolders `css`, `js`, `fonts` in `ko-cart` +4. Create `index.html` within `ko-cart` +5. Put all JS libraries to corresponding subfolders according to file types +6. Modify content of following `index.html` to set file links correctly + +```html + + + + KO Shopping Cart + + + + + + + + + +``` + +## The view-model + +Objective: Create a simple MVVP have multiple items in catalog + +### The view + +Objective: Create a simplist MVVP for start + +Steps: +1. Add data bind into body of HTML +2. Create `js/viewmodel.js` to create simplest view-model + +Outcome shown in 4e774c2 \ No newline at end of file