2 回答

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
最早的時(shí)候,業(yè)務(wù)很簡(jiǎn)單,我們寫樣的代碼。
$.ajax({ url: 'http://ooxx.cn/getUser' success: function(user){ //進(jìn)行DOM操作 $('#name').val(user.name); $('#email').val(user.email); } })
后來(lái),user 的字段越來(lái)越多。
$.ajax({ url: 'http://ooxx.cn/getUser' success: function(user){ //進(jìn)行DOM操作 $('#name').val(user.name); $('#email').val(user.email); $('#address').val(user.address); $('#phone').val(user.phone); $('#blog').val(user.blog); //可能還有更多的字段,并且DOM操作不一定這么簡(jiǎn)單只是值的修改 //可能還要負(fù)責(zé)整個(gè)視圖是否出現(xiàn):比如 isVIP 為 false 時(shí),出現(xiàn)付費(fèi)引導(dǎo)等。 } })
于是我們考慮將對(duì)象與模版進(jìn)行綁定,進(jìn)一步抽離
$.ajax({ url: 'http://ooxx.cn/getUser' success: function(user){ rener(user); } }) var render = function(obj){ //進(jìn)行DOM操作 $('#name').val(user.name); $('#email').val(user.email); $('#address').val(user.address); $('#phone').val(user.phone); $('#blog').val(user.blog); }
只是簡(jiǎn)單的代碼封裝,整個(gè)結(jié)構(gòu)就清晰很多。但緊接著,我們開(kāi)始使用 websocket 來(lái)做界面的即時(shí)更新,于是代碼再次修改。
這是一個(gè)用戶列表
socket = new WebSocket("ws://192.168.1.71:7070"); socket.onmessage = function(data) { var obj = JSON.parse(data) if(obj.action === "update"){ render(userList); } } var render = function(obj){ //進(jìn)行DOM操作 $('#name').val(user.name); $('#email').val(user.email); $('#address').val(user.address); $('#phone').val(user.phone); $('#blog').val(user.blog); }
很棒,接著我們想像到這個(gè) user 將會(huì)有非常多的 function,如果到處是 $("") 這樣的方式進(jìn)行DOM操作,如果有一天,HTML 上的 id/class 要稍變一下,那改起來(lái)就痛苦了。
把用戶這個(gè)做成 Model,加上 render(), showPhone(), sendEmail() 這樣各種的方法。將大大增加代碼的組織能力。
-------------------------
其實(shí)上面寫了這么多,只是想說(shuō)明,需求在不斷增加的時(shí)候,項(xiàng)目不斷變大的時(shí)候,原有的代碼組織無(wú)法滿足需要,需要站在各高的層次,將項(xiàng)目中常用的方法進(jìn)行抽離封裝。于是,便有了框架。
backbone 做得事很專注,充分發(fā)揮MVC的組織分層能力,繼續(xù)把DOM交給 jQuery 去做。
而更新的前端MVC框架,如:angularjs, emberjs 等,將 model 與 template(HTML) 進(jìn)行綁定,直接幫助你渲染,讓我們不用再關(guān)心渲染、DOM處理,而是把注意力集中在業(yè)務(wù)及交互處理上。
既然是框架,解決的必然是復(fù)雜的、復(fù)雜的事情。如果只是簡(jiǎn)單的幾個(gè)DOM處理,用框架肯定是太重太浪費(fèi)了。

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
Backbone 基本沒(méi)有關(guān)于Dom 渲染的功能. 所以從jQuery角度講, 數(shù)據(jù)ajax過(guò)來(lái)后直接操作Dom 感覺(jué)很直觀,沒(méi)必要在重新定義一個(gè)model.
但是如果同樣的數(shù)據(jù)在同一個(gè)頁(yè)面多處使用呢? 同一個(gè)數(shù)據(jù)在多個(gè)頁(yè)面多出使用呢. 作為SPA,所以都在一個(gè)頁(yè)面上, 這樣把 ajax過(guò)來(lái)的數(shù)據(jù)抽象成一個(gè)model, 就比較方便.
但Backbone的view 沒(méi)有加入bind的功能, 所以感覺(jué)上還需要在view上監(jiān)聽(tīng)model變化再render刷新整個(gè)view. 建議使用 一個(gè)插件 modelbinder. 這樣數(shù)據(jù)變化后就不需要刷新整個(gè)view而是只更新某個(gè)屬性對(duì)應(yīng)的小dom, 一般就是span標(biāo)簽或某個(gè)input標(biāo)簽,這樣大大簡(jiǎn)化程序復(fù)雜度,代碼方便,而且性能更好.
backbone,由于沒(méi)有C, 整個(gè)都是view里面, 而view的設(shè)計(jì)有沒(méi)有集成模板和dom渲染,顯得有些不太好用.
所以其他的框架 例如angular js, knockout 都提出ViewModel的概念 就是數(shù)據(jù)綁定的概念,只要model變化了數(shù)據(jù), view會(huì)自動(dòng)變化,非常方便. 而backbone并沒(méi)有提供這些功能,而只是一個(gè)代碼組織的框架. angular 里面基本不在需要jQuery操作DOM, 就是數(shù)據(jù)和View是一體的. 數(shù)據(jù)和view是綁定的, 沒(méi)有在單獨(dú)操作dom的概念.