亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 MVC 里 Model 被監聽, 每次更新操作就會導致界面被重新繪制, 也顯得很怪???

在 MVC 里 Model 被監聽, 每次更新操作就會導致界面被重新繪制, 也顯得很怪啊?

aluckdog 2023-04-30 15:11:44
沒從 C++/Java 學起, 對 MVC 和面向對象的理解還是后來慢慢積累起來的相對我覺得腳本語言各種范式各種靈活, 只是缺少面向對象組織代碼的整齊呆板而且從前使用 DOM API 時候就覺得 DOM 就像一種數據類型,JS 操作數據同時, 也在更改界面. 通過直接訪問界面, 也能讀取數據, 很強大對吧但我接觸 Backbone 一段時間, 困惑也覺得越來越多而從前靈活解決前端問題的思路, 隨著 MVC 提出的分離有了各種阻礙, 或者不方便直接 JS DOM 操作吧MVC 在 Backbone 里是 Model 和 View-Controller 兩者分離, 另加上 Collection.每次 Model(Collection) 發生改變, View 重新渲染一次, 然后搞定或者 DOM 上的事件從 Controller 傳到 Model 里進行一次改變, View 跟著改變好這樣其實 jQuery 豐富的 DOM 操作就顯得無所用處如果在 Backbone 的應用里加上大量的 DOM 操作, View 刷新時又變得尷尬為了性能, JS 在進行 DOM 操作時會講操作全在 HTML 字符串里存儲好, 一次寫入可在 Backbone 里, 如果小的 item 也是 Model, 那么 render 也是分開了自己做的我理解, 這樣兩者就不能夠很好地兼容, 至少有一個方面要打折扣了另一個功能是實時保存和更新, 純的 DOM 操作, JS 監聽 DOM, 在背后保存數據很簡單
查看完整描述

2 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

最早的時候,業務很簡單,我們寫樣的代碼。

  $.ajax({    url: 'http://ooxx.cn/getUser'
    success: function(user){      //進行DOM操作
      $('#name').val(user.name);
      $('#email').val(user.email);
    }
  })

后來,user 的字段越來越多。

  $.ajax({
    url: 'http://ooxx.cn/getUser'
    success: function(user){      //進行DOM操作
      $('#name').val(user.name);      $('#email').val(user.email);      $('#address').val(user.address);      $('#phone').val(user.phone);      $('#blog').val(user.blog);      //可能還有更多的字段,并且DOM操作不一定這么簡單只是值的修改
      //可能還要負責整個視圖是否出現:比如 isVIP 為 false 時,出現付費引導等。
    }
  })

于是我們考慮將對象與模版進行綁定,進一步抽離

  $.ajax({
    url: 'http://ooxx.cn/getUser'
    success: function(user){
      rener(user);
    }
  })
  
  var render = function(obj){      //進行DOM操作
      $('#name').val(user.name);      $('#email').val(user.email);      $('#address').val(user.address);      $('#phone').val(user.phone);      $('#blog').val(user.blog);
  }

只是簡單的代碼封裝,整個結構就清晰很多。但緊接著,我們開始使用 websocket 來做界面的即時更新,于是代碼再次修改。

這是一個用戶列表

  
  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){      //進行DOM操作
      $('#name').val(user.name);      $('#email').val(user.email);      $('#address').val(user.address);      $('#phone').val(user.phone);      $('#blog').val(user.blog);
  }

很棒,接著我們想像到這個 user 將會有非常多的 function,如果到處是 $("") 這樣的方式進行DOM操作,如果有一天,HTML 上的 id/class 要稍變一下,那改起來就痛苦了。
把用戶這個做成 Model,加上 render(), showPhone(), sendEmail() 這樣各種的方法。將大大增加代碼的組織能力。

-------------------------

其實上面寫了這么多,只是想說明,需求在不斷增加的時候,項目不斷變大的時候,原有的代碼組織無法滿足需要,需要站在各高的層次,將項目中常用的方法進行抽離封裝。于是,便有了框架。

backbone 做得事很專注,充分發揮MVC的組織分層能力,繼續把DOM交給 jQuery 去做。

而更新的前端MVC框架,如:angularjs, emberjs 等,將 model 與 template(HTML) 進行綁定,直接幫助你渲染,讓我們不用再關心渲染、DOM處理,而是把注意力集中在業務及交互處理上。

既然是框架,解決的必然是復雜的、復雜的事情。如果只是簡單的幾個DOM處理,用框架肯定是太重太浪費了。


查看完整回答
反對 回復 2023-05-03
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

Backbone 基本沒有關于Dom 渲染的功能. 所以從jQuery角度講, 數據ajax過來后直接操作Dom 感覺很直觀,沒必要在重新定義一個model.

但是如果同樣的數據在同一個頁面多處使用呢? 同一個數據在多個頁面多出使用呢. 作為SPA,所以都在一個頁面上, 這樣把 ajax過來的數據抽象成一個model, 就比較方便.

但Backbone的view 沒有加入bind的功能, 所以感覺上還需要在view上監聽model變化再render刷新整個view. 建議使用 一個插件 modelbinder. 這樣數據變化后就不需要刷新整個view而是只更新某個屬性對應的小dom, 一般就是span標簽或某個input標簽,這樣大大簡化程序復雜度,代碼方便,而且性能更好.

backbone,由于沒有C, 整個都是view里面, 而view的設計有沒有集成模板和dom渲染,顯得有些不太好用.

所以其他的框架 例如angular js, knockout 都提出ViewModel的概念 就是數據綁定的概念,只要model變化了數據, view會自動變化,非常方便. 而backbone并沒有提供這些功能,而只是一個代碼組織的框架. angular 里面基本不在需要jQuery操作DOM, 就是數據和View是一體的. 數據和view是綁定的, 沒有在單獨操作dom的概念.


查看完整回答
反對 回復 2023-05-03
  • 2 回答
  • 0 關注
  • 281 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號