1.关于ng-model

<textarea id="feature_name" class="col-sm-3" placeholder="软件特征" ng-model="data.dlls[$index]" ng-repeat="i in data.dlls track by $index"></textarea>

注意ng-model="data.dlls[$index]",如果改成ng-model="i",虽然会成功将dlls里的内容显示在文本区中,但是当dlls.push新项时(就创建新的textarea),之前的textarea中显示的内容将消失。
2.当directive被放置到控制器中时,在directive里的ng表达式所引用的变量与直接写在控制器的html中的变量无异。
3.每一次ng事件,都会检查所有的值。ng-checked是最好的证明,如果一个input 被选中,然后去触发其他元素的ng事件,这个input上的ng-checked中绑定的事件处理函数也会被执行。
同样的,$watch监听着任何事件,只要触发了任何事件,其中的函数都会被执行(不符合逻辑)。
4.$cookies.a 返回的是一个字符串,而$cookieStore.a返回的可以是number或boolean
5.之前想要根据cookie判断信息是否显示过某段文本,文本形如

<p id="updateInfo" ng-if="updateInfo" update-info>
homeApp.controller('homeMainCtrl', ['$scope', '$timeout', '$cookieStore', function($scope, $timeout, $cookieStore){}]);
homeApp.directive('updateInfo',['$timeout', '$cookieStore', function($timeout, $cookieStore){
return {
priority:599,//注意这个值
link: function(scope,elem,attr){
$cookieStore.put('updateInfoShowed',false);
if($cookieStore.get('updateInfoShowed')){
scope.updateInfo = false;
}
else {
scope.updateInfo = true;
$cookieStore.put('updateInfoShowed',true);
$timeout(function(){
elem.slideToggle();
},8000);
}
console.log(document.getElementById('updateInfo'))//注意这个console
}
};
}]);

当priority:599时,根本没有执行console。
猜测:是因为ng-if的指令优先度较高,执行我这条指令时,p元素已经被ng-if指令移出出dom或者设置dispaly:none了,所以没有执行link中的代码。
例证1:把ng-if改为ng-show,console出p的dom。
例证2:当priority:600时,console结果为null,也就是说提高了优先度console就被执行了。

例证2输出null意味着在本指令的link函数执行时元素不存在dom中。而例证1说明在本指令的link函数执行时dom已经存在。
那么,例证2中元素之所以不存在,原因可能有2:
(1)是否因为ng-if?难道ng-if的优先度比600要大?
如果是这样,那么599与600间的分界是什么导致的?
(2)还是因为ng-if,而ng-if的优先度确实是599。
在这种假设下,另一种可能性是ng-if在compile期做过些什么。

6.alert会阻塞线程,所以要使用setTimeout(function(){alert()},0)
7.jQuery.ajax({url:"/a.html",type:"GET"})和jQuery.get("/a.html")有区别,前者似乎会被angularjs认为是对文件的访问,后者会被ng进行路由处理。
8.重载视图使用 $route.reload();
9.在directive里elem.on('click',function(){scope.day = 'yesterday'}),这是想改变scope的day,但会导致controller中的$scope.$watch失效,view里也不会更新(即使是在directive所在元素内)。
这种时候要写成

yesterday.on('click', function(){
scope.$apply(function(){
scope.day = 'yesterday';
})
});

10.ng-cloak闪烁问题。写.ng-hide{display:none},然后在元素中添加.ng-hide
11.template文件中的html,应该保持其独立性,比如:
<div ng-template></div>
template.html:
<ul><li></li></ul>
固然这样写也可以:
<ul ng-template></ul>
template.html:
<li></li>
但是template.html就缺乏了独立性,它被限定了必须被一个ul所包括。
12.ng-class使用{xx:xx}[data-list-row]是无效的,只能换用驼峰写法。
13.ng-if会销毁dom,重现加载时会重载dom以及指令,恐怕作用域也会重载。但是ng-if所在的元素,其template不会被重载
14.子元素$emit,父元素$broadcast给那个子元素的兄弟元素,这可以,但是要注意事件的名称不能一致。
15.$location.search()可以获取?后的键值对
16.有混合ng的src与href一定要使用ng-src和ng-href。不然,前者会在某些浏览器上导致跳转到404页面。
17.$anchorScroll会根据hash跳转,但修改hash会导致页面刷新,要这么写:

var old = $location.hash()
$location.hash(id);
$anchorScroll();
$location.hash(old)

18.ng-change会根据ng-pattern决定是否触发。要每次按键触发使用ng-press
19.ng-style="{true: {'color': 'red'}}[true]"
20.$timeout在作用域on('$destory')时一定要销毁
21.ng-bind="010203"会显示10203,可能是进制问题
22.使用ng-if在指令或者指令的父元素上时,可能会导致ng-if这个指令先于自定义指令被执行,导致自定义指令执行时找不到dom而无效。
23.我曾在指令内试图将使用了ng-model="formData.password"绑定数据的formData传给服务器,但结果formData为undefined。解决办法是在指令link里加scope.formData = {};原理未知。
24.给指令设置scope:{}可能会导致其中的子元素上的指令失效
25.ng的$resource服务若无写getGroup: {url: '/client/group/index', method: 'GET', responseType: 'arraybuffer'}这里的responseType,会默认返回的是json作处理,如果不是json会报错如:
Error: [$resource:badcfg] http://errors.angularjs.org/1.2.26/$resource/badcfg?p0=object&p1=array
25.1 其实应该写isArray: true
26.不能在$resource里刷时间戳,如:
 clientDetail: {params: {m: 'eqdetail', t: (new Date).getTime()}, method: 'GET'} 
这样会导致所有时间戳都固定为同一个数字,必须写成
 softwareService.clientDetail({uuid: client.uuid, t: (new Date).getTime()}) 
27.指令中使用replace:true时,要保证模板被包括在一个容器中,
<input /><p></p>——这样是不行的,会报错如:Error: [$compile:tplrt] Template for directive 'rewardPoint' must have exactly one root element. /js/apps/main/tpl/rewardPoint.html
<div><input /><p></p></div>——必须如此加个div包括,其实这样我何苦使用replace:true
28.ng-href="{{ down({fileType: 'csv'}) }}" ng-href中使用函数一定要在最外面用大括号括起来,其实在html里使用ng表达式写函数都得这么干
29.得注意变量命名,如果命名tab-index,在{{ tab-index }}会理解为tab 减去 index,常常结果为0。
30.若在作用域中写$scope.f = function(d){$scope.data = d;};再在其子作用域中调用scope.f('text');结果会给父作用域的$scope.data赋值。
应该改写成this.data = d;
31.ng-click会触发ng循环,所以执行的代码中不能执行$apply
32.scope.vm的最大作用是让子元素的成员改变同时能改动到父元素的成员。
33.单例模式如factory,其生命期为应用的生命期。所以是否使用factory存放vm,需要考虑。
34. $apply会使ng进入 $digest cycle , 并从$rootScope开始遍历(深度优先)检查数据变更。
$digest仅会检查该scope和它的子scope,当你确定当前操作仅影响它们时,用$digest可以稍微提升性能。
35.directive中执行的 $evalAsync , 会在angular操作DOM之后,浏览器渲染之前执行。
36.在html里的ng-click要获取this,可以使用$event.currentTarget
37.var binder = scope.$on('xxx');要解绑,执行binder()
38.$cookieStore.get(...),只能访问到path允许访问的值
39.ng-if会产生子作用域。使用这种指令时,其内部无作用域指令对scope的修改都会修改到它的作用域;如果目标作用域在ng-if之上就会出错。
解决方案一般有1.使用ng-show代替ng-if。2.使用factory注入,修改factory
40.ng发get请求,貌似会删除值为undefined的属性
41.使用track by可以免去移除dom再生成dom的步骤提高性能。
41.1 但是正因为不再生成dom,所以新生成的元素上的directive指令也不会被运行。所以能不能既利用原有dom,又渲染指令呢?
42.
$http().then(function(n)) // n是包装过的,真实数据在n.data里
$http().success(function(data)) // data就是真实数据
43. 我常常疑惑什么应该写在controller里,什么应该写到directive里。
controller会先于任何directive加载,而directive加载会有顺序,先子后父。根据这个来考虑怎么写吧。
44.当directive内有个templateUrl的子directive时,directive内使用elem.find()貌似找不到子directive的内容。
45.ng里可以在controller或factory等任何地方中通过$compile服务渲染指令。但指令不会即时被渲染,至少不会在controller中立即被渲染,而是在后续的检查中被渲染。除非你在父作用域或指令的作用域上调用了scope.$digest(),则指令将被立即渲染。
立即渲染意味着立即发起对模板的请求。

【经验】AngularJS的更多相关文章

  1. 具备 jQuery 经验的人如何学习AngularJS(附:学习路径)

    这是一个来自stackoverflow的问答,三哥直接把最佳回答搬过来了. 都说AngularJS的学习曲线异常诡异~~~ Q: “Thinking in AngularJS” if I have a ...

  2. 【经验】Angularjs 中使用 layDate 日期控件

    layDate 控件地址:http://laydate.layui.com/ 前情:原来系统中使用的日期控件是UI bootstrap(地址:https://angular-ui.github.io/ ...

  3. 【经验】angularjs 实现带查找筛选功能的select下拉框

    一.背景 对于select的下拉列表,像国家选择这样的功能,全世界那么多国家,一直拉滚动条多辛苦,眼睛也要盯着找,累!so,为优化用户体验,带查找功能的下拉框是非常非常有必要的.都知道jquery里有 ...

  4. 使用 AngularJS 和 ReactJS 的经验

    1. React 福音 当我们的团队开始寻找一个合适的前端框架的时候,我们考虑了许多选择,最后留下两个选项 —— Angular 和 React. Angular 是目前为止最成熟的方案:它拥有一个庞 ...

  5. 接近带给你AngularJS - 经验说明示例

    接近带给你AngularJS列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自己定义指令 ------------ ...

  6. AngularJS性能优化心得,自己踩过的抗,及一些别人的经验(转哦)

    脏数据检查 != 轮询检查更新 谈起angular的脏检查机制(dirty-checking), 常见的误解就是认为: ng是定时轮询去检查model是否变更.其实,ng只有在指定事件触发后,才进入$ ...

  7. AngularJs学习经验汇集

    >>关于ng-include 有时候你会发现你用这个指令想要加载某个模板总是加载不出来,url明明是对的,页面还是一片空白,这里有一个细节要注意以下: <div ng-include ...

  8. AngularJs(v1)相关知识和经验的碎片化记录

    1.利用angular指令监听ng-repeat渲染完成后执行脚本 http://www.cnblogs.com/wangmeijian/p/5141266.html 2.$http的POST请求中请 ...

  9. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...

随机推荐

  1. mybatis:"configuration" must match "(properties?,settings?,typeAliase.....

    在运行mybatis配置文件的时候,出现错误: mybatis:"configuration" must match "(properties?,settings?,ty ...

  2. iOS 之 Swift 新特性

    支持所有C和OC的基本类型 提供了Array 和Dictionary两个强劲的集合类型 元组 可选类型 闭包 脚本特性 类型安全

  3. iOS 之 Property List

    1. 概念 用于存储串行化对象,xml格式,存储到plist文件中. 2. 用途 存储用户设置. 3. 优点 程序运行时可动态创建和读写. 4. 使用说明 4.1. 获取plist文件 NSStrin ...

  4. HUD-5124-lines

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5124 这题题目做的好悲催,比赛时题目意思不理解,也没有深究了,赛后又看了很久没有看懂,问了很多才搞懂, ...

  5. 读取SQLServer数据库存储过程列表及参数信息

    得到数据库存储过程列表: select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name ...

  6. MySQL生产库全库备份脚本

    创建一个单独的备份用户backup,不要用root 创建备份目录 :mkdir -p /databackup/fullbackup mysql> grant SELECT,RELOAD,SHOW ...

  7. 介绍一个开源的在线管理SQLServer的小工具--SQLEntMan

    近来有许多人问起SQL在线管理的问题,遂将以前用过的一个开源SQL 在线管理工具修改了一下,并分享. 看下效果图: 原项目的地址:http://sourceforge.net/projects/asp ...

  8. sqlserver怎么将查询出来的数据存到新的数据库表中

    查询结果直接创建一个新表存放select * into [新表名] FROM [原表名]WHERE 车辆='小汽车' 若新建表要放在另一个数据库B中USE BGOSELECT * INTO [新表名] ...

  9. 《深度探索C++对象模型》笔记——Data语意学

    Data Member的绑定 inline member functin躯体之内的一个data member绑定操作会在整个class声明完成之后才发生. argument list中的名称还是会在它 ...

  10. 让EFCore更疯狂些的扩展类库(一):通过json文件配置sql语句

    前言 EF通过linq和各种扩展方法,再加上实体模型,编写数据库的访问代码确实是优美.舒服,但是生成的sql不尽如意.性能低下,尤其是复杂些的逻辑关系,最终大家还是会回归自然,选择能够友好执行sql语 ...