伺服器載入與儲存資料
現在,你已經瞭解MVVM模式如何為動態UI有組織地整理用戶端程式碼,以及knockout.js的可觀察物件(observables)、繫結(bindings)、相依追蹤(dependency tracking)是如何運作。
幾乎所有網站應用程式,都需要由伺服器取得資料和傳送修改的資料回去伺服器。因為Knockout.js 是一個純用戶端函式庫,它能非常有彈性運作在任何伺服器端技術(例如,ASP.NET、ASP.NET MVC、Rails、PHP…等),以及任何架構模式、資料庫…等。只要伺服器端程式碼可以傳送與接收JSON資料,就能呈現以下教學。
範例:工作清單
ViewModel:
function Task(data) {
this.title = ko.observable(data.title);
this.isDone = ko.observable(data.isDone);
}
function TaskListViewModel() {
// 資料
var self = this;
self.tasks = ko.observableArray([]);
self.newTaskText = ko.observable();
self.incompleteTasks = ko.computed(function() {
return ko.utils.arrayFilter(self.tasks(), function(task) { return !task.isDone() });
});
// 行為
self.addTask = function() {
self.tasks.push(new Task({ title: this.newTaskText() }));
self.newTaskText("");
};
self.removeTask = function(task) { self.tasks.remove(task) };
}
ko.applyBindings(new TaskListViewModel());
從ViewModel定義我可以看出來這是一個工作清單,Task物件有抬頭與是否完成。TaskListViewModel物件清單新增、刪除與完成等處理。讀者現在應該已經具備看懂以上程式碼的能力。
View:
<h3>工作</h3>
<form data-bind="submit: addTask">
新增工作: <input data-bind="value: newTaskText" placeholder="需要做些什麼?" />
<button type="submit">新增</button>
</form>
<ul data-bind="foreach: tasks, visible: tasks().length > 0">
<li>
<input type="checkbox" data-bind="checked: isDone" />
<input data-bind="value: title, disable: isDone" />
<a href="#" data-bind="click: $parent.removeTask">刪除</a>
</li>
</ul>
你有 <b data-bind="text: incompleteTasks().length"> </b> 個未完成的工作。
<span data-bind="visible: incompleteTasks().length == 0"> - 現在是啤酒時間 !</span>
以下是此範列使用的CSS:
ul { list-style-type: none; margin: 1em 0; background-color: #cde; padding: 1em; border-radius: 0.5em; }
ul li a { color: Gray; font-size: 90%; text-decoration: none }
ul li a:hover { text-decoration: underline }
input:not([type]), input[type=text] { width: 30em; }
input[disabled] { text-decoration: line-through; border-color: Silver; background-color: Silver; }
textarea { width: 30em; height: 6em; }
form { margin-top: 1em; margin-bottom: 1em; }
花點時間先玩一下這個範例,新增、刪除、完成一些清單內容。