逻辑代码的拆分
作为一个 MVVM
框架,Angular
应用本身就应该按照 模型,视图模型(控制器),视图来划分。
这里逻辑代码的拆分,主要是指尽量让 controller
这一层很薄。提取共用的逻辑到 service
中 (比如后台数据的请求,数据的共享和缓存,基于事件的模块间通信等),提取共用的界面操作到 directive
中(比如将日期选择、分页等封装成组件等),提取共用的格式化操作到 filter
中等等。
在复杂的应用中,也可以为实体建立对应的构造函数,比如硬盘(Disk
)模块,可能有列表、新建、详情这样几个视图,并分别对应的有 controller
,那么可以建一个 Disk
构造函数,里面完成数据的增删改查和验证操作,有跟 Disk
相关的 controller
,就注入 Disk
构造器并生成一个实例,这个实例就具备了增删改查和验证方法。这样既层次分明,又实现了复用(让 controller
层更薄了)。
8、angular 应用常用哪些路由库,各自的区别是什么?
Angular1.x
中常用 ngRoute
和 ui.router
,还有一种为 Angular2
设计的 new router
(面向组件)。后面那个没在实际项目中用过,就不讲了。
无论是 ngRoute
还是 ui.router
,作为框架额外的附加功能,都必须以 模块依赖 的形式被引入。
区别
ngRoute
模块是 Angular
自带的路由模块,而 ui.router
模块是基于 ngRoute
模块开发的第三方模块。
ui.router
是基于 state
(状态)的, ngRoute
是基于 url
的,ui.router
模块具有更强大的功能,主要体现在视图的嵌套方面。
使用 ui.router
能够定义有明确父子关系的路由,并通过 ui-view
指令将子路由模版插入到父路由模板的 <p ui-view></p>
中去,从而实现视图嵌套。而在 ngRoute
中不能这样定义,如果同时在父子视图中 使用了 <p ng-view></p>
会陷入死循环。
分属不同团队进行开发的 angular
应用,如果要做整合,可能会遇到哪些问题,如何解决?
可能会遇到不同模块之间的冲突。
比如一个团队所有的开发在 moduleA 下进行,另一团队开发的代码在 moduleB 下
1 2 3 4 5 6 7 8 9 10 |
|
会导致两个 module
下面的 serviceA
发生了覆盖。
貌似在 Angular1.x
中并没有很好的解决办法,所以最好在前期进行统一规划,做好约定,严格按照约定开发,每个开发人员只写特定区块代码。
9、angular 的缺点有哪些?
强约束
导致学习成本较高,对前端不友好。
但遵守 AngularJS
的约定时,生产力会很高,对 Java
程序员友好。
不利于 SEO
因为所有内容都是动态获取并渲染生成的,搜索引擎没法爬取。
一种解决办法是,对于正常用户的访问,服务器响应 AngularJS 应用的内容;对于搜索引擎的访问,则响应专门针对 SEO 的HTML页面。
性能问题
作为 MVVM 框架,因为实现了数据的双向绑定,对于大数组、复杂对象会存在性能问题。
可以用来 优化 Angular 应用的性能 的办法:
减少监控项(比如对不会变化的数据采用单向绑定)
主动设置索引(指定 track by
,简单类型默认用自身当索引,对象默认使用 $$hashKey
,比如改为 track by item.id
)
降低渲染数据量(比如分页,或者每次取一小部分数据,根据需要再取)
数据扁平化(比如对于树状结构,使用扁平化结构,构建一个 map
和树状数据,对树操作时,由于跟扁平数据同一引用,树状数据变更会同步到原始的扁平数据)
另外,对于Angular1.x ,存在 脏检查 和 模块机制 的问题。
移动端
可尝试 Ionic,但并不完善。
10、解释下什么是$rootScrope
以及和$scope
的区别?
通俗的说$rootScrope
页面所有$scope
的父亲
如何产生$rootScope
和$scope
吧。
step1:Angular解析ng-app
然后在内存中创建$rootScope
。
step2:angular回继续解析,找到{{}}表达式,并解析成变量。
step3:接着会解析带有ng-controller
的p
然后指向到某个controller
函数。这个时候在这个controller
函数变成一个$scope
对象实例。
**11、如何取消 $timeout
, 以及停止一个$watch()
? **
停止 $timeout
我们可以用cancel
:
1 2 3 4 |
|
停掉一个$watch
:
// .$watch()
会返回一个停止注册的函数
1 2 3 4 5 6 7 8 |
|
12、Angular Directive中restrict 中分别可以怎样设置?scope中@,=,&有什么区别?
restrict中可以分别设置:
A匹配属性
E匹配标签
C匹配class
M 匹配注释
当然你可以设置多个值比如AEC,进行多个匹配。
在scope中,@,=,&在进行值绑定时分别表示
@
获取一个设置的字符串,它可以自己设置的也可以使用{{yourModel}}
进行绑定的;
=
双向绑定,绑定scope
上的一些属性;
&
用于执行父级scope
上的一些表达式,常见我们设置一些需要执行的函数
13、$apply()
和 $digest()
的区别
安全性:$apply()
可以接收一个参数作为function()
,这个 function
会被包装到一个 try … catch
块中,所以一旦有异常发生,该异常会被 $exceptionHandler service
处理。
$apply
会使ng
进入 $digest cycle
, 并从$rootScope
开始遍历(深度优先)检查数据变更。
$digest
仅会检查该scope和它的子scope
,当你确定当前操作仅影响它们时,用$digest
可以稍微提升性能。
更多编程相关知识,请访问:编程视频!!
以上就是13个关于angular的前端面试题(总结)的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
了解一下angular中的@input()和@output()
2021年值得尝试的7个angular前端组件库,快来收藏吧!
更多相关阅读请进入《前端面试题》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者