总结十个Angular.js由浅入深的面试问题


Posted in Javascript onAugust 26, 2016

一、ng-show/ng-hide 与 ng-if的区别?

我们都知道ng-show/ng-hide实际上是通过display来进行隐藏和显示的。而ng-if实际上控制dom节点的增删除来实现的。因此如果我们是根据不同的条件来进行dom节点的加载的话,那么ng-if的性能好过ng-show.

二、解释下什么是$rootScrope以及和$scope的区别?

通俗的说$rootScrope 页面所有$scope的父亲。

总结十个Angular.js由浅入深的面试问题

我们来看下如何产生$rootScope$scope吧。

step1:Angular解析ng-app然后在内存中创建$rootScope

step2:angular回继续解析,找到{{}}表达式,并解析成变量。

step3:接着会解析带有ng-controller的div然后指向到某个controller函数。这个时候在这个controller函数变成一个$scope对象实例。

三、表达式 {{yourModel}}是如何工作的?

它依赖于 $interpolation服务,在初始化页面html后,它会找到这些表达式,并且进行标记,于是每遇见一个{{}},则会设置一个$watch。而$interpolation会返回一个带有上下文参数的函数,最后该函数执行,则算是表达式$parse到那个作用域上。

四、Angular中的digest周期是什么?

每个digest周期中,angular总会对比scopemodel的值,一般digest周期都是自动触发的,我们也可以使用$apply进行手动触发。

五、 如何取消 $timeout, 以及停止一个$watch()?

停止 $timeout我们可以用cancel

var customTimeout = $timeout(function () { 
 // your code
}, 1000);

$timeout.cancel(customTimeout);

停掉一个$watch:

// .$watch() 会返回一个停止注册的函数
function that we store to a variable 
var deregisterWatchFn = $rootScope.$watch(‘someGloballyAvailableProperty', function (newVal) { 
 if (newVal) {
  // we invoke that deregistration function, to disable the watch
  deregisterWatchFn();
  ...
 }
});

六、Angular Directive中restrict 中分别可以怎样设置?scope中@,=,&有什么区别?

restrict中可以分别设置:

     A匹配属性

     E匹配标签

     C匹配class

     M 匹配注释

当然你可以设置多个值比如AEC,进行多个匹配。

scope中,@,=,&在进行值绑定时分别表示

     @获取一个设置的字符串,它可以自己设置的也可以使用{{yourModel}}进行绑定的;

     = 双向绑定,绑定scope上的一些属性;

     & 用于执行父级scope上的一些表达式,常见我们设置一些需要执行的函数

angular.module('docsIsolationExample', []) 
.controller('Controller', ['$scope', function($scope) {
 $scope.alertName = function() {
   alert('directive scope &');
 }
}])
.directive('myCustomer', function() {
 return {
  restrict: 'E',
  scope: {
   clickHandle: '&'
  },
  template: '<button ng-click="testClick()">Click Me</button>',
  controller: function($scope) {

   $scope.testClick = function() {
    $scope.clickHandle();

   } 
  }
 };
});
<div ng-app="docsIsolationExample"> 
<div ng-controller="Controller"> 
 <my-customer click-handle="alertName()"></my-customer>
</div> 
 </div>

< 进行单向绑定。

七、 列出至少三种实现不同模块之间通信方式?

     1、Service

     2、events,指定绑定的事件

     3、使用 $rootScope

     4、controller之间直接使用$parent, $$childHead等

     5、directive 指定属性进行数据绑定

八、有哪些措施可以改善Angular 性能

官方提倡的,关闭debug,$compileProvider

myApp.config(function ($compileProvider) { 
 $compileProvider.debugInfoEnabled(false);
});

使用一次绑定表达式即{{::yourModel}}

减少watcher数量

在无限滚动加载中避免使用ng-repeat

使用性能测试的小工具去挖掘你的angular性能问题,我们可以使用简单的console.time()也可以借助开发者工具以及Batarang

console.time("TimerName"); 
//your code
console.timeEnd("TimerName");

九、你认为在Angular中使用jQuery好么?

这是一个开放性的问题,尽管网上会有很多这样的争论,但是普遍还是认为这并不是一个特别好的尝试。其实当我们学习Angular的时候,我们应该做到从0去接受angular的思想,数据绑定,使用angular自带的一些api,合理的路由组织和,写相关指令和服务等等。angular自带了很多api可以完全替代掉jquery中常用的api,我们可以使用angular.element,$http,$timeout,ng-init等。

我们不妨再换个角度,如果业务需求,而对于一个新人(比较熟悉jQuery)的话,或许你引入jQuery可以让它在解决问题,比如使用插件上有更多的选择,当然这是通过影响代码组织来提高工作效率,随着对于angular理解的深入,在重构时会逐渐摒弃掉当初引入jquery时的一些代码。(?Po主就是这样的人,希望不要被嘲笑,业务却是赶着走)

所以我觉得两种框架说完全不能一起用肯定是错的,但是我们还是应该尽力去遵循angular的设计。

十、如何进行angular的单元测试

我们可以使用karam+jasmine 进行单元测试,我们通过ngMock引入angular app然后自行添加我们的测试用例。 一段简单的测试代码:

describe('calculator', function () {

 beforeEach(module('calculatorApp'));

 var $controller;

 beforeEach(inject(function(_$controller_){
  $controller = _$controller_;
 }));

 describe('sum', function () {
    it('1 + 1 should equal 2', function () {
      var $scope = {};
      var controller = $controller('CalculatorController', { $scope: $scope });
      $scope.x = 1;
      $scope.y = 2;
      $scope.sum();
      expect($scope.z).toBe(3);
    });  
  });

});

十一、总结

以上就是这篇文章的全部内容了,希望对大家的学习和工作能有所帮助。如果有疑问可以留言讨论。

Javascript 相关文章推荐
javascript 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
javascript简易缓动插件(源码打包)
Feb 16 Javascript
jQuery插件 selectToSelect使用方法
Oct 02 Javascript
jquery form表单序列化为对象的示例代码
Mar 05 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
Apr 02 Javascript
js表单提交和submit提交的区别实例分析
Dec 10 Javascript
关于json字符串与实体之间的严格验证代码
Nov 10 Javascript
canvas实现图片根据滑块放大缩小效果
Feb 24 Javascript
Bootstrap导航中表单简单实现代码
Mar 06 Javascript
微信小程序中进行地图导航功能的实现方法
Jun 29 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
Jun 21 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
Aug 24 Javascript
Jquery遍历select option和添加移除option的实现方法
Aug 26 #Javascript
响应式表格之固定表头的简单实现
Aug 26 #Javascript
jQuery基于BootStrap样式实现无限极地区联动
Aug 26 #Javascript
BootStrap无限级分类(无限极分类封装版)
Aug 26 #Javascript
jquery 动态合并单元格的实现方法
Aug 26 #Javascript
轻松掌握JavaScript中介者模式
Aug 26 #Javascript
修改jquery中dialog的title属性方法(推荐)
Aug 26 #Javascript
You might like
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
JavaScript实现滑块验证解锁
2021/01/07 Javascript
python实现的防DDoS脚本
2011/02/08 Python
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
python tkinter组件摆放方式详解
2019/09/16 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
全球度假村:Club Med
2017/11/27 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
大学四年学习的自我评价分享
2013/12/09 职场文书
写得不错的求职信范文
2014/07/11 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
休假证明书
2015/06/24 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
一文读懂navicat for mysql基础知识
2021/05/31 MySQL