angular体验
08 Aug 2016
上次学着用react写了一个url收藏简单功能。这次照着这个需求,用angular1
来实践一下。
先列一下需求:
- 一个表单(添加新链接)
- 一个列表(展示已存链接)
- 一个链接类型列表(展示已有的链接类型)
与react
基本dom
都在jsx
代码体现不同,angular
要结合模板和js
;
可以先定义好基本dom:
忘了,没说明一下项目结构:但其实也很简单
-lib angular.js
-js index.js
-index.html
angular1用的js既非es6,也不需要jsx编译,所以页面直接引用就好了。
页面用到的数据方面,我沿用react实践时的数据
angular的概念了,基本是module跟control,考虑到表单跟列表直接有交互,而多个control之间交互可能比较复杂,于是我采取一个control来实现,事实上内容也很简单。
整个部分里面,应当数链接类型列表最为简单,先看它怎么实现的:
首先是模板,应该是接受一个变量数组的数据,然后对照到模板,遍历输出对应的dom,其次是点击每个类型,要有一个触发url列表数据的变动展示(这个等说到列表的时候再一并说明)
说到遍历数组,首先想到的应该是ngRepeat指令了,其语法如下:
基本可以从代码语义上分析出,这个模板会根据变量list输出所有的div来。
那模仿一下这次实现类型列表的模板如下:
假设,我们在js那边设定好了$scope的types变量存储的是url的类型数组,那这里就是类似于:
再者,我们看到这里有个ngClass
指令,这个指令的用法是设定一个根据判断来决定是否添加给当前dom
的class
比如这里的代码,意为根据currentType==type
来决定当前dom是否要设置active
这个class
,其实就是给展示当前选中的类型。
而ngClick
指令,则是设置了当前dom的一个点击事件触发,当dom被点击时,会调用$scope.showList(type);
这里的type
不再需要加``;
我们再看一下js那边怎么写对应的逻辑:
【这次的逻辑基本是在ubCtrl
里面实现的了,后面写的$scope
我就不写出来多余了。】
可以看到showList的实现:
currentType
变量设置为对应的type
,list变量则获取对应type的url列表,后面的判断是为了当选择的类型没有数据的时候,则刷新数据(这是在写的过程中遇到的逻辑问题处理。)
可以看到js的处理也很简单。
再来看列表的模板:
没有特殊的逻辑,跟类型列表一样,遍历list变量,展示信息,这里我们看点击删除的操作:
这里有一些特殊处理了,因为angular是双向绑定,但我这里对list做了多次赋值操作,这就导致了修改某次列表对应的变量,并不会带来dom的一个相应,所以需要对list做一次重新赋值;
并且,在这里删除时赋值前作的list.length
判断,其实是针对于,当我点击某个类型的数据展示的时候,我点击删除其中一个数据,此时list并没有对应删除数据,而我要判断当某个类型数据都删完时,需要刷新类型数据,此时,只能先做判断【我感觉是我对angular
应用规范不熟悉,所以遇到bug只能暂时这么处理着先】
那么到此为止,剩下的就是表单的实现了。先看模板:
这个内容比较多了,多出的知识点:
ng-model
锁定了url对象的某个属性,这样我们在点击提交按钮的触发函数里直接可以用url这个作为实参来传递整个数据组合
再看select标签,这里用了ngInit
和ngOptions
指令还有ngChange
最后那个是change事件触发跟click差不多,
ngOptions
则跟ngRepeat
有点相似,不过这个用于select标签,语法细化到输出label和value两个值。 看模板上的使用:
将生成option标签值为type,text文本为type.label
,ngOption
除了可以遍历数组, 还能遍历对象的,具体用法可看angular
官网。
ngInit
则是能让你在模板上使用表达式,比方这里模板上设置了对应的listType,但js里面并没有往$scope.listType
设置初始值的时候,可在ngInit
处设置listType的值。
这里js只要实现触发change处理,以及按钮提交处理,遇到的逻辑坑是改变绑定数据导致ngChange
,此时ngInit
早已过了执行(不会再执行),需要代码做判断初始化model数据。
也是第一次用angular来做一点点小实践,可能理念不一样,一个是对双向绑定,不好适应,所以也导致实现过程中,各种逻辑要写一些判断处理来修复bug,但相应的js代码量可观,只是加上模板的话,就不一定有所优势。
模板:
js: