-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathviewModel.ts
51 lines (44 loc) · 1.65 KB
/
viewModel.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
Encapsulates a viewmodel
Enabled two-way binding between model and DOM
*/
module ViewModel {
export function bind(obj, property, domElement) {
Object.defineProperty(obj, property, {
get: () => domElement.value,
set: newValue => { domElement.value = newValue; },
configurable: true
});
}
export function bindArray(obj, property, domElement, renderFunction)
{
Object.defineProperty(obj, property, {
get: () => {
return JSON.parse(domElement.getAttribute("data-products") || "[]");
},
set: newValue => {
domElement.setAttribute("data-products", JSON.stringify(newValue));
domElement.innerHTML = renderFunction(newValue);
},
configurable: true
});
}
export class ProductViewModel {
name: string
price: number
products: ProductViewModel[]
}
}
var vm = new ViewModel.ProductViewModel();
vm.products = [];
ViewModel.bind(vm, 'name', document.querySelector('.productName'));
ViewModel.bind(vm, 'price', document.querySelector('.productPrice'));
vm.name = "Candle";
vm.price = 100;
ViewModel.bindArray(vm, 'products', document.querySelector(".productList"), (newValue) => newValue.map(e => "<li>" + e.name + " (" + e.price + ")" + "</li>").join(" "));
document.querySelector('.addProductButton').addEventListener("click", () => {
var newProduct = new ViewModel.ProductViewModel();
newProduct.name = vm.name;
newProduct.price = vm.price;
vm.products = vm.products.concat([newProduct]);
});