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. 解决mysql 1864 主从错误

     从字面意思看了一下是因为slave_pending_jobs_size_max默认值为16777216(16MB),但是slave接收到的slave_pending_jobs_size_max为 ...

  2. iOS 之 alcatraz (插件管理器)

    1. 安装 1.1. 打开命令行 curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/ins ...

  3. 用控制台命令拉取git最新仓库代码

    C#利用Diagnostics  拉取最新代码  示例代码 static void DiagnosticTest() { Process p; ProcessStartInfo psi; psi = ...

  4. php生成PDF文件(FPDF)

    首先要下载FPDF http://www.fpdf.org/  附件可以在我的资源里下载http://yunpan.cn/c3RJ5BpPfX6dL  访问密码 f1f2 FPDF文档:http:// ...

  5. C语言中strcpy,strcmp,strlen,strcat函数原型

    //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char ...

  6. Oracle基础学习(二)v$session中Command的数字含义

    v$session中Command的数字含义. 1 CREATE TABLE 2 INSERT 3 SELECT 4 CREATE CLUSTER 5 ALTER CLUSTER 6 UPDATE 7 ...

  7. ASP.NET\MVC 解决C#上传图片质量下降,图片模糊,水印有杂点的问题

    对图片处理这一块不是很懂,自己写不出来,这些年一直没有停止找一个上传图片质量不下降,加水印不会导致模糊和水印周边产生杂点的代码. 网上基本上99.9%的代码处理图片质量都是下面这两句: //设置质量 ...

  8. GreenOpenPaint的实现(一)基本框架

    Win7下的MSPaint是Ribbon的典型运行.这种SDI程序对于图像处理来说是很适合的.利用春节时间,基于之前的积累,我实现GreenOpenPaint,主要就是模拟MSPaint的界面,实现出 ...

  9. tbl.js div实现的表格控件,完全免费,不依赖jquery

    html上现在有比较好用的表格控件是datatable,但是编辑.按钮等部分是收费的,只有基础功能免费.而且尺寸发生变化时需要手工刷新等繁琐操作较多.所以我开发一个免费的供大家使用. 本项目已用于&q ...

  10. 关于a.b和a[b]的区别

    在写代码的过程中,我们经常可以看到a.b或啊a[b],但是他们有什么区别呢: 简单说一下吧,有自己的还用群友的大力支持! 在js的对象中 var arr = {a:"b",b:&q ...