MVVM架構~Knockoutjs系列之js接收(shou)C#數據集(ji)合的方式
在controller里將數據拿到(dao),并且(qie)存儲到(dao)ViewBag對象里,最后在View上顯示出來,這是傳統的MVC開發方式(shi),事實上引入(ru)Knockoutjs以后,這種方式(shi)還是適合的,Knockoutjs只是在前臺數據綁定中做了一點調整,它(ta)不在依賴于后臺具(ju)體數據,你(ni)完全可以在
最(zui)后(hou)去為它動(dong)態綁定(ding)數據,一般地,我們會(hui)為這(zhe)種頁(ye)面添(tian)加一個JS文件(jian),用來(lai)獲取數據,以實現前臺開發(fa)(fa)人員與后(hou)臺代碼開發(fa)(fa)人員的分離。
從(cong)view層拿(na)數據的(de)(de)方式有兩(liang)種,第一(yi)是(shi)通(tong)過(guo)ViewBag,ViewData,TempData,Model等(deng)容器來存(cun)儲(chu),然后(hou)在View上直接取(qu)即可(ke)(ke),而第二種方式是(shi)通(tong)過(guo)一(yi)個GET請求,它通(tong)常是(shi)異步的(de)(de),你可(ke)(ke)以(yi)使用JQ里的(de)(de)getJSON,它可(ke)(ke)以(yi)方便的(de)(de)實現數據的(de)(de)獲取(qu)工作,它對集合的(de)(de)支
持是比較好的。
方式一,通過ViewBag等容器實現的集合
var json =@Html.Raw(Json.Encode(ViewBag.Category));
這(zhe)時,json變量已經是一個Json數組了,它(ta)將C#里的IEnumable集合轉換成了JSON對象
方式二,通過getJSON等方式實現異步獲取
注意,異步(bu)執行,它的(de)意思是(shi)說(shuo),你的(de)頁面(mian)(mian)在(zai)一(yi)個ajax請(qing)求時(shi),不會去等待它,而是(shi)直接執行下面(mian)(mian)的(de)語(yu)句,這(zhe)樣,對于大數據量情況下,瀏覽器不會假死,用戶體驗會好(hao)一(yi)些(xie),但有時(shi),開發(fa)人(ren)員在(zai)寫代碼(ma)時(shi),往(wang)往(wang)會掉(diao)到AJAX的(de)陷阱中,看下面(mian)(mian)代碼(ma):
$.getJSON("//localhost:2166/api/values/", function (data) { var Cart = function () { // Stores an array of lines, and from these, can work out the grandTotal var self = this; //self.lines = ko.observableArray([new CartLine()]); self.lines = ko.observableArray(data); // Operations self.addLine = function () { self.lines.push(new CartLine()) }; self.removeLine = function (line) { self.lines.remove(line) }; } }); ko.applyBindings(new Cart());
不仔細看,看不出問題,但一運行程序,問題就出來了,“從服務器那邊獲取不到數據”,這是為什么呢,明明有數據呀,這就是AJAX的陷阱了,你的 ko.applyBindings(new Cart())沒(mei)有等待上面(mian)的取數據完,就輸出了,所以,什么都沒(mei)有,下面(mian)是正常的代碼
你可以對比一下:
$.getJSON("//localhost:2166/api/values/", function (data) { var Cart = function () { // Stores an array of lines, and from these, can work out the grandTotal var self = this; //self.lines = ko.observableArray([new CartLine()]); self.lines = ko.observableArray(data); // Operations self.addLine = function () { self.lines.push(new CartLine()) }; self.removeLine = function (line) { self.lines.remove(line) }; } ko.applyBindings(new Cart()); });
怎么樣,只是代碼的位置不同,結果就完全不同吧,呵呵!所以說,我們對問題的理解程度,有時,應該有一種“模棱兩不可”的精神!