Knockout + SignalR 實現FB的聊天功能(三)–為頁面建立ViewModel

Knockout + SignalR 實現FB的聊天功能(三)–為頁面建立ViewModel

今天開始要進入第一個重點:"Knockout" !

 

當初對這個名字其實滿不熟的,因為現在太多 Javascript 的 Library,所以也沒有每個都

仔細的去看到底是做什麼用的。某天在看黑大的利用SignalR實現遠端程式遙控功能這篇

文章時,發現有好多語法很陌生,於是花了一個下午的時間去做了Knockout官網的教學範例,

沒想到一玩就愛上了!  Knockout 讓網頁互動變得非常簡單。只要有 ViewModel 再加上後端

提供的資料,就可以做出一個完整的網站。

 

本篇以範例規劃出這個頁面的 ViewModel,並先做一些測試資料,來體驗 Knockout 的便利!

P.S 雖然本篇會說明 Knockout 的用法,但還是強烈建議玩過官網的教學一遍。

 

首先先來看頁面,主要分做幾個區塊:

image

 

區塊1:所有人員的列表

區塊2:目前正在聊天的人員列表

區塊3:使用者

區塊4:對話

 

今天先來說明列表要怎麼做(區塊1)。以這樣的配置來說,我所規劃出的 ViewModel,

會是下列的樣子:

image

說明:

ko.observableArray() 為 Knockout 提供的 function,當你的屬性需要做綁定時,就需要這樣

做設置,Knockout 會幫助未來屬性的值變動時,通知其他屬性或元素做連動。

參數為初始的值,這邊用ko.observableArray([]) 代表初始的值是一個空陣列。

 

image

說明:

因為不喜歡寫太多參數,因此用 data 把參數也當成一個 model

data = data || {};  這行是為了避免當呼叫者沒有傳參數時造成錯誤,因此若data = null 時,就

預設給他一個空集合。下面的寫法 data.image || 'none.png' 也是一樣,若傳進來的model沒有

image 這個屬性時,就給他預設值 'none.png'。

ko.observable() 也是 Knockout 的 function,跟 ko.observableArray() 的說明類似,只是後者為陣列。

 

接著,在頁面上 new 出 物件,並將測試資料丟入

image

 

到這邊,ViewModel 跟資料都準備好了,接著只要把屬性綁定到頁面的元素上,再利用一些流程控制,

就可以根據 ViewModel 呈現出資料了。以下為 All  Tab 下的人員列表綁定方式:

image

 

詳細的用法,可以看官網的文件,寫的非常簡單明瞭。而且用法上也滿直覺的(可能我寫習慣了MVC),

因此大概寫個幾次就知道大概的使用方式了。

 

到這邊,所有人員的列表就已經完成。

image

 

這樣看可能還沒有感覺,我加一個測試的按鈕,並在按下這按鈕時,加入一個 User 到 All Tab 中。

看看會有什麼樣的效果。

image

image

 

實際的效果,有興趣的人就下載範例來玩玩看囉。

完整範例下載