2014年2月27日星期四

Angular 组件

在angular里面,指令其实和组件的意思是完全不同的,但是多数人并没有很好的区分它们。并把指令提升到了完全和组件相当的高度去了,这大大加剧了指令的编写难度。事实是指令和组件完全是两个概念。

Angular的核心思想应该是以数据为中心的,但是方法是否应该是数据的一部分,这个问题还是值得商榷的。就算从比较纯的函数观点来看的话,完全无副作用的函数似乎也不应个视为与数据等同。Angular解决方法与数据间隔阂的方法其实就是通过事件完成的,说的更直白一点其实就是scope中的$watch方法。这个方法让我们得知了数据的变化,可用从容的对数据进行处理,并把视角从处理数据的方法上转回到数据本身上来。

但是如果从数据的视角(也就是angular的视角)来看的话,组件就十分的复杂。因为组件会牵扯复杂的DOM变化,和相应的数据变化,这些数据变化可能十分的剧烈,而似乎这些数据的变化也可能并不需要知会angular所感知的数据模型部分(也就是scope)。因为组件从来都不是以数据为中心的,恰恰相反,组件往往就是来操作数据的,比如说增查删改。数据在组件这里往往都是从属的对象无法被视为中心枢纽。所以组件的视角和angular的视角总是矛盾的。这也是往往在使用指令来卡法组件时让我们感到不利索的原因。此外,指令的嵌套也会使数据模型之间的关系变得复杂。因为指令往往也会有一个scope以及和它相关的作用域。这些原因导致使用指令的组件不但设计实现困难,且使用起来也很不方便。归根结底就是因为指令并不是实现组件的好方式,特别是复杂的组件。

个人认为,一个比较好的做法是把页面的组件干脆封装成独立的JS对象,把对scope的数据操作彻底的封装成相应的事件。这样似乎能够好一点。这个对象自己决定在何时传递数据。

不过我一向不认为纯粹的就好,恰恰相反,我认为简单,直接,有效的才是好的。繁复的做法一定要有原因,如果仅仅是为了契合某种说不清道不明的哲学,我认为是完全不值得的。最后审视一下我们的项目,我觉得require js的作用远远大于angular js。事实上,我倒觉得,angular并不是一个好的系统框架,而是应该作为某个前台系统框架的一部分,这样应该是比较好的。不过这个系统得多复杂呀。我的经验告诉我,复杂的设计注定不能长久。

没有评论: