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

第一点区别是, ng-if 在后面表达式为 true 的时候才创建这个 dom 节点, ng-show 是初始时就创建了,用 display:block 和 display:none 来控制显示和不显示。

第二点区别是, ng-if 会(隐式地)产生新作用域, ng-switch 、 ng-include 等会动态创建一块界面的也是如此。

这样会导致,在 ng-if 中用基本变量绑定 ng-model ,并在外层 div 中把此 model 绑定给另一个显示区域,内层改变时,外层不会同步改变,因为此时已经是两个变量了。

<p>{{name}}</p>

<div ng-if="true">

  <input type="text" ng-model="name">

</div>

ng-show 不存在此问题,因为它不自带一级作用域。

避免这类问题出现的办法是,始终将页面中的元素绑定到对象的属性(data.x)而不是直接绑定到基本变量(x)上。

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

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

我们来看下如何产生$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总会对比scope上model的值,一般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 性能

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

myApp.config(function ($compileProvider) {

$compileProvider.debugInfoEnabled(false);

});

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

3.减少watcher数量

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

5.使用性能测试的小工具去挖掘你的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时的一些代码。(

最新文章

  1. 数据库设计中的Soft Delete模式
  2. Bubble Cup 8 finals E. Spectator Riots (575E)
  3. apache 80端口部属多站点配置
  4. 解决: libcimtd.lib not found, rpcndr.lib not found
  5. COJ 1287 求匹配串在模式串中出现的次数
  6. ios开发逆向传值的几种方法整理
  7. Flex 医疗行程图
  8. Linux 下配置网卡的别名即网卡子IP的配置 转
  9. 04day2
  10. C#实现的apache htpasswd加密
  11. phpexcel导出成绩表
  12. linux rsync服务
  13. Kotlin 检查空类型
  14. ASCII对应码表-键值(完整版)
  15. 你应该掌握的C++ RAII手法:Scopegaurd
  16. IOS 数据存储之 Core Data详解
  17. Tomcat默认界面可导致版本信息泄露+管理后台爆破
  18. Codeforces Round #528 div1
  19. jsp页面转发获取不到参数
  20. 解惑《你必须知道的.net》——C#继承关系中【方发表】的创建和调用

热门文章

  1. javascript举例介绍事件委托的典型使用场景
  2. sqlalchemy的外键与relationship查询
  3. python学习,day3:函数式编程,局部变量和全局变量
  4. 在windows上添加cygwin右键
  5. DIV盒子介绍
  6. encodeURI、encodeURIComponent、btoa及其应用场景
  7. git --mixed --soft --hard之间的区别
  8. 解决windows10下总是很快自动黑屏进入睡眠问题
  9. &quot;Calendars&quot; and &quot;DateFormats&quot; should not be static
  10. 14 线程间协作的两种方式:wait、notify、notifyAll和Condition