avalon如何在兼容ie的狀況下作到雙向綁定呢?

avalon能夠兼容到ie6,貌似它的雙向綁定是和vue同樣用object的set和get實現的,那是如何實現兼容呢?還有一個問題,angular用了許多object對象的方法纔不兼容ie的麼,那麼angular當初爲何不作兼容呢?髒檢查機制徹底能夠作到兼容。或者說有什麼技術使ng很難兼容呢?

 

 
 
司徒正美
JavaScript 話題的優秀回答者
112 人贊同了該回答

avalon兼容IE6其實沒有大家想象的那麼困難,主要是知識面上的差別。前端

像我掌握js, ruby, python, vbscript等多種腳本語言的前提下,一些認爲非夷所思的思路其實對我來講也不是什麼大事。vue

退一步說,avalon的各個版本實現雙向綁定也不盡然。python

avalon1.4.*與1.5.*是使用動態收集依賴,這是從knockout那裏學來的。react

js語句針對於 = 號,有兩種用法redux

賦值語句, obj.a = 1api

取值語句,var b = obj.a瀏覽器

我要作的是就是劫持了這個等號,讓它在取值時進行依賴收集,賦值時進行視圖更新。這在其餘語言中,有settter,getter可用,而在前端,只有IE8只以用set,get語句,Object.defineProperty只能用於元素節點。只有到了IE9及其餘高版本W3C瀏覽器,這個Object.defineProperty才能讓我大膽使用。幸虧的是,W3C瀏覽器早就有__defineSetter__,defineGetter__可用。ruby

問題就是IE6-8,我稍微動用了VBScript。 用到VBScript的代碼也不超過100行。固然這對於不懂VBScript的人多是很難的。所以博學是有好處,能拓展你的思惟與門路。框架

其餘要兼容IE的處理,比較事件綁定要用attachEvent, dettachEvent啊,監聽元素的value值變化要用propertychange事件啊,IE的NodeList不能用Array.property.slice.call來轉化啊,這些都有現成方案,兼容起來一點難度也沒有,而且合起來也不超過500行代碼。函數

在avalon1.5,我還學習angular那樣使用靜態分析進行依賴收集,到avalon1.6這個技術已經研習得差很少,到avalon2,因爲大量使用虛擬DOM技術與單純的靜態分析依賴,vm就更加輕量,源碼裏也不多操做DOM了。

只要不怎麼操做DOM,針對IE的hack也用得不多,反而,爲了性能,avalon是動用了大量的新API,這些HTML5 API所佔比例是其餘MVVM框架沒法比擬的。

所以不要總盯着avalon兼容IE6 的方面,就算是兼容了IE6,avalon1.4.7.2的5893行代碼,也比小而美的vue的9820行代碼, angular的30248行代碼, 只專一視圖的react的2W行代碼(此外你一般還要加上1W5K行的JSX轉換器, redux才能用於生產環境) ,emberjs的5W8K行代碼, 精簡多了!
 
貘吃饃香
北京碎催,衚衕串子,說話痞,聖母婊請勿近
15 人贊同了該回答

路過
恰好以前跟教主扯淡時候說過這個
並寫了個大體例子
現成可用不費腦子就來答下

主要是用 Object.defineProperty 就能夠搞了
可是對於老版本 IE 這玩意沒有
就用VBS來搞了
(這是聽正美說的,他的 avalon 我沒看過也沒用過……)
基本上老的快入土前端的估計到這就明白了

原理很簡單
VBS 的 Class 中成員對象能夠 Get 和 Set
VBS 的變量值在老 IE 中又能夠和 JScript 互通
因此應該是用 VBS 構建 Class 並實例化返回結果就好
並且 IE 的 execScript 函數能夠根據語言類型動態運行 code
就能作到動態構建 VBS 代碼執行並拿到返回結果
核心原理大體以下:

var code = '' + 'Class MyObject\n' + ' Private px \n' + ' Sub Class_Initialize()\n' + ' px = 1\n' + ' End Sub\n' + ' Public Property Get x\n' + ' alert("Get Value is:" & px)\n' + ' End Property\n' + ' Public Property Let x(nx)\n' + ' alert("Set Value is:" & nx)\n' + ' px = nx\n' + ' End Property\n' + 'End Class\n' + 'Dim obj\n' + 'Set obj = New MyObject'; execScript(code, 'vbscript'); obj.x; obj.x = 2;

此時 JS 的 obj 對象成員 x
在 set get 時候均可以有 alert hook 的調用

固然
angular 沒跟 avalon 同樣這麼搞是由於
它們壓根沒有兼容老 IE 的需求
畢竟國外市場IE6這等老古董早就入土了
相關文章
相關標籤/搜索