angular常见面试题

2017-07-13  本文已影响0人  俊_杰

两个平级界面块 a 和 b,如果 a 中触发一个事件,有哪些方式能让 b 知道?详述原理

这个问题换一种说法就是,如何在平级界面模块间进行通信。有两种方法,一种是共用服务,一种是基于事件。

共用服务
在 Angular 中,通过 factory 可以生成一个单例对象,在需要通信的模块 a 和 b 中注入这个对象即可。
基于事件
这个又分两种方式

第一种是借助父controller。在子 controller中向父 controller触发($emit)一个事件,然后在父controller中监听($on)事件,再广播($broadcast)给子 controller,这样通过事件携带的参数,实现了数据经过父 controller,在同级controller之间传播。
第二种是借助 $rootScope。每个 Angular 应用默认有一个根作用域 $rootScope, 根作用域位于最顶层,从它往下挂着各级作用域。所以,如果子控制器直接使用 $rootScope 广播和接收事件,那么就可实现同级之间的通信。

一个 angular 应用应当如何良好地分层?

目录结构的划分

对于小型项目,可以按照文件类型组织,比如:

css
js
  controllers
  models
  services
  filters
templates  

但是对于规模较大的项目,最好按业务模块划分,比如:

 css
modules
  account
  controllers
  models
  services
  filters
  templates
disk
 controllers
 models
 services
 filters
 templates

modules 下最好再有一个 common 目录来存放公共的东西。

逻辑代码的拆分

作为一个 MVVM 框架,Angular 应用本身就应该按照 模型,视图模型(控制器),视图来划分。

这里逻辑代码的拆分,主要是指尽量让 controller 这一层很薄。提取共用的逻辑到 service 中 (比如后台数据的请求,数据的共享和缓存,基于事件的模块间通信等),提取共用的界面操作到 directive 中(比如将日期选择、分页等封装成组件等),提取共用的格式化操作到 filter 中等等。

在复杂的应用中,也可以为实体建立对应的构造函数,比如硬盘(Disk)模块,可能有列表、新建、详情这样几个视图,并分别对应的有 controller,那么可以建一个 Disk 构造函数,里面完成数据的增删改查和验证操作,有跟 Disk 相关的 controller,就注入 Disk 构造器并生成一个实例,这个实例就具备了增删改查和验证方法。这样既层次分明,又实现了复用(让 controller 层更薄了)。

分属不同团队进行开发的 angular 应用,如果要做整合,可能会遇到哪些问题,如何解决?

可能会遇到不同模块之间的冲突。
比如一个团队所有的开发在 moduleA 下进行,另一团队开发的代码在 moduleB 下

angular.module('myApp.moduleA', [])
.factory('serviceA', function(){
    ...
})

angular.module('myApp.moduleB', [])
.factory('serviceA', function(){
    ...
})    

angular.module('myApp', ['myApp.moduleA', 'myApp.moduleB'])    

会导致两个 module 下面的 serviceA 发生了覆盖。

貌似在 Angular1.x 中并没有很好的解决办法,所以最好在前期进行统一规划,做好约定,严格按照约定开发,每个开发人员只写特定区块代码。

上一篇 下一篇

猜你喜欢

热点阅读