`

avalon如何在兼容ie的情况下做到双向绑定呢?

 
阅读更多
avalon可以兼容到ie6,貌似它的双向绑定是和vue一样用object的set和get实现的,那是如何实现兼容呢?还有一个问题,angular用了许多object对象的方法才不兼容ie的么,那么angular当初为什么不做兼容呢?脏检查机制完全可以做到兼容。或者说有什么技术使ng很难兼容呢?

 

 
 
司徒正美
JavaScript 话题的优秀回答者
112 人赞同了该回答

avalon兼容IE6其实没有你们想象的那么困难,主要是知识面上的差异。

像我掌握js, ruby, python, vbscript等多种脚本语言的前提下,一些认为非夷所思的思路其实对我来说也不是什么大事。

退一步说,avalon的各个版本实现双向绑定也不尽然。

avalon1.4.*与1.5.*是使用动态收集依赖,这是从knockout那里学来的。

js语句针对于 = 号,有两种用法

赋值语句, obj.a = 1

取值语句,var b = obj.a

我要做的是就是劫持了这个等号,让它在取值时进行依赖收集,赋值时进行视图更新。这在其他语言中,有settter,getter可用,而在前端,只有IE8只以用set,get语句,Object.defineProperty只能用于元素节点。只有到了IE9及其他高版本W3C浏览器,这个Object.defineProperty才能让我大胆使用。幸好的是,W3C浏览器早就有__defineSetter__,defineGetter__可用。

问题就是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这等老古董早就入土了
分享到:
评论

相关推荐

    avalon的实现

    4. Shims和Polyfills:Avalon为旧版本浏览器提供了Shims和Polyfills,确保在各种环境下都能正常运行。 三、Avalon的主要功能 1. 模型管理:Avalon提供了一套完整的模型管理系统,包括模型的创建、修改和销毁,以及...

    mvvm双向绑定机制的原理和实现代码(推荐)

    在实际开发中,如果要考虑兼容性,例如IE9以下的浏览器,可以选择使用如Avalon.js这样的库。Avalon.js利用VBScript封装了getter和setter,解决了低版本IE的兼容问题。 总的来说,MVVM的双向绑定虽然涉及的技术并不...

    avalon-1.4.5.zip

    此外,avalon.js对浏览器的兼容性极佳,支持IE6+及现代浏览器,使得它在各种项目中都能发挥出色。 六、社区与生态 得益于阿里云的背景,avalon.js拥有丰富的社区资源,包括官方文档、社区论坛、GitHub仓库等,...

    Avalonjs双向数据绑定与监听的实例代码

    在前端开发中,Avalonjs是一个轻量级的、数据驱动的双向数据绑定的JavaScript框架。使用Avalonjs,开发者可以轻松地实现视图层与数据模型层之间的同步更新,这被称为双向数据绑定。在双向数据绑定中,当数据模型发生...

    初识Avalon

    这个文件可能是Avalon的兼容性补丁或者一个旧版本的库,用于确保Avalon能在各种浏览器环境中正常工作,特别是对不支持ES5特性的旧版浏览器。 5. **学习路径** - 首先,理解MVVM模式及其在Avalon中的实现至关重要...

    avalon cookbook讲解

    - 尽管Avalon已经内置了许多功能,但在某些特定情况下,开发者仍可以与jQuery等其他库混用。 9. **API和更新日志**: - Avalon的API相对稳定,但随着版本更新,可能会有一些新的特性和改动。 - 官方通常会在更新...

    jq + avalon2 实现穿梭框.pdf

    在本篇文档中,我们探讨了利用jQuery(简称jq)和avalon2框架来实现一个穿梭框(又称穿梭选择器、双向选择器或穿梭控制)的过程。穿梭框是一种常见的Web界面组件,它能够帮助用户在两个列表之间进行元素的选择和转移...

    avalon+require前端框架DEMO

    在avalon中,开发者可以通过声明式的数据绑定,将JavaScript对象的属性与DOM元素关联,使得数据的变化能够实时反映到界面,反之亦然。 另一个关键部分是**require.js**,这是一款流行的JavaScript模块加载器和打包...

    Avalon-MM Pipeline Bridge

    为了验证Avalon-MM Pipeline Bridge的效果,开发者通常会进行性能测试和仿真,对比有无Bridge的情况下的系统运行情况。这可能包括事务吞吐量、延迟、资源利用率等方面的指标。通过这些指标,我们可以明确地看到...

    Avalon_总线规范_中文_fpga_smallciy_avalon总线规范_

    Nios II是Altera的软核CPU,它完全兼容Avalon总线,可以轻松地与其他Avalon接口的IP模块进行集成,如存储器控制器、外设接口等。 10. 小型城市(smallcity)应用: "smallcity"可能指的是一个特定的项目或应用...

    Avalon接口类型浅析

    在Avalon-MM接口文档中,流控的概念被称为Flow Control(流控),而Stream(流模式)则被留给Avalon-ST接口文档。 Avalon-ST接口是2006年11月之后引入的新的接口概念,采用非总线形式的连接,提供了点对点专用连接...

    前端项目-avalon.js.zip

    1. **双向数据绑定**:这是avalon.js的基石,它使得视图层的改变能实时反映到模型层,反之亦然。通过`<ms-attr>`、`<ms-text>`等指令,开发者可以轻松实现元素属性与JavaScript对象的双向绑定。 2. **指令系统**:...

    JavaScript 中 avalon绑定属性总结

    首先,avalon的属性绑定可以分为几种类型,包括作用域圈定、双向绑定属性、可见性控制、元素插入移除处理、数据缓存、属性操作、样式操作、事件绑定以及循环操作。 在作用域圈定方面,avalon使用ms-controller来...

    Avalon-ST总线规范

    - **数据包传输**:在需要高速且可靠的数据包传输的情况下,Avalon-ST提供了一个优秀的解决方案,尤其是在网络通信领域。 - **数字信号处理(DSP)**:对于DSP处理中的大量数据传输需求,Avalon-ST同样表现出色,能够...

    Avalon.pdf_前端学习资料

    Avalon2引入了虚拟DOM和属性劫持技术,确保在各种浏览器环境下,包括对旧版IE的支持,都能保持良好的兼容性和性能。它还支持移动开发、后端渲染以及WEB Component式的组件开发,而且无需预编译,直接可用。 ...

    基于avalon225js封装了几个常用组件

    在JavaScript开发领域,框架和库的使用极大地提高了开发效率,其中Avalon.js是一个轻量级的MVVM框架,尤其适合构建大型前端项目。本文将深入探讨基于Avalon.js 2.2.5版本封装的几个常用组件,以及如何在实际开发中...

    Avalon总线下的PWM IP Core.rar

    在具体应用中,开发者可能需要通过Avalon总线动态调整PWM IP核的占空比,以实现不同场景下的需求。例如,在电机控制中,改变占空比可以调整电机的转速;在电源管理中,通过调整PWM信号可以实现精细的电压调节。 综...

    peridot-avalon-mm_avalon-mm_avalon资料_

    这些实例可能是为了帮助开发者理解和学习如何在他们的硬件设计中实现Avalon-MM接口,或者用于测试和验证Avalon-MM兼容的组件。 标签"avalon-mm"和"avalon资料"进一步确认了这个压缩包的内容侧重于Avalon-MM协议的...

    Avalon入门

    3. **良好的兼容性**:AvalonJS支持IE6及以上版本浏览器,同时还兼容主流的现代浏览器,如Firefox、Chrome等,为开发者提供了广泛的平台支持。 4. **高性能**:经过长时间的优化,AvalonJS能够在现代浏览器中支持...

    Avalon总线规范中文版

    Avalon总线规范是一种在FPGA芯片内部用于外设与处理器间通信的片内总线标准。Nios系统是一种由Altera公司开发的可配置软核处理器,广泛应用于Altera FPGA芯片中。在Nios系统中,所有的外设都是通过Avalon总线与Nios ...

Global site tag (gtag.js) - Google Analytics