AngularJs数据绑定原理【转】

$watch How the $apply Runs a $digest — AngularJS TIPS 翻译     作者:junyuecao | 发表于 8-8 13:39 | 最后更新时间:8-9 02:34 原文地址:http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/ 此文为原创翻译,转载请注明出处! 注 这篇博文主要是写给新手的,是给那些刚刚开始接触Angular,并且想了解数据帮定是如何工作的人。如果你已经对Angular比较了解了,那强烈建议你直接去阅读源代码。 Angular用户都想知道数据绑定是怎么实现的。你可能会看到各种各样的词汇:$watch,$apply,$digest,dirty-checking…它们是什么?它们是如何工作的呢?这里我想回答这些问题,其实它们在官方的文档里都已经回答了,但是我还是想把它们结合在一起来讲,但是我只是用一种简单的方法来讲解,如果要想了解技术细节,查看源代码。 让我们从头开始吧。 浏览器事件循环和Angular.js扩展 我们的浏览器一直在等待事件,比如用户交互。假如你点击一个按钮或者在输入框里输入东西,事件的回调函数就会在javascript解释器里执行,然后你就可以做任何DOM操作,等回调函数执行完毕时,浏览器就会相应地对DOM做出变化。 Angular拓展了这个事件循环,生成一个有时成为angular context的执行环境(记住,这是个重要的概念),为了解释什么是context以及它如何工作,我们还需要解释更多的概念。 $watch 队列($watch list) 每次你绑定一些东西到你的UI上时你就会往$watch队列里插入一条$watch。想象一下$watch就是那个可以检测它监视的model里时候有变化的东西。例如你有如下的代码 index.html User:<input type=”text” ng-model=”user”/>Password:<input type=”password” ng-model=”pass”/> 在这里我们有个$scope.user,他被绑定在了第一个输入框上,还有个$scope.pass,它被绑定在了第二个输入框上,然后我们在$watch list里面加入两个$watch: controllers.js app.controller(‘MainCtrl’,function($scope){ $scope.foo =”Foo”; $scope.world =”World”;}); index.html Hello,{{World}} 这里,即便我们在$scope上添加了两个东西,但是只有一个绑定在了UI上,因此在这里只生成了一个$watch. 再看下面的例子: controllers.js app.controller(‘MainCtrl’,function($scope){ $scope.people =[...];}); index.html […]

80,90后需要提前领悟的至高心法

1:每天11:00点前睡觉,每天7:30点前起床;  2:每天提醒自己,不要忘记梦想;  3:有时间多看书,多学习,做一个有文学素养的人,不要把时间浪费在滑稽怪诞的事情上; 4:多锻炼身体,身体垮了什么都没有了,散仙不才,搞IT的人大多数,身体都不怎么样,所以,一定要多锻炼身体,包括发动自己的爱人,亲人,朋友一起参与!  5:努力学习赚钱的本领,钱是一个人活着的根本,当你落魄时,你就会发现,没有多少人会真正帮助你的,尤其是在钱方面,所以务必要在法律允许范围内多赚钱,在当今及以后日子里,钱真的是万能,但你必须要把如上的第4条给做好!  6:常回家看看老妈,常给姐姐哥哥电话,亲情是最珍贵的感情; 7:要学会做个倾听者,要多听听别人的感受,从中获得教训;  8:要学会玩,学会有品位的玩; 9:工作上的烦恼,不要带回家,解决不了任何问题,带回来会平添更多烦恼; 10:做工作的有心人;  11:学会奉承领导,多摆笑脸,不做恶人,三缄其口,三思而后行;  12:学会推拖事情,人善被人欺,马善被人骑;  13:不和没素养的人交往,免得受其影响;  14:不与小气的人交往,吃亏的总是自己;  15:对装B的人要一棒子打死,让他(她)下次再也牛不起来!    16:不与已婚人或者已经同居的人或者有对象的人谈感情,多半是浪费口舌,纯属扯淡,最后没什么收获,反而打击自己的生活激情; 17:要寻找与自己有共同价值观的人,爱自己的人,好好珍惜,好好保护,终了一生;  18:不要把感情浪费在没有希望的人身上,看重外在的人永远都是弱智,只有在伤痕累累时才明白,真正爱她的人原来一直在她身边关注她,而她却一直以为幸福很遥远;  19:不要过分将就一个人,过分将就不是爱情,是犯贱;  20:现实一点,爱情在现实面前总是那么苍白,浪漫的爱情不属于男人,属于女人; 21:做婚姻的有心人,好好准备步入婚姻,好好准备做一个好丈夫好妻子; 22:做生活的有心人,用心准备营造一个美好的家庭,一个安全温馨的家庭; 23:不要老是想做救世主,就算是救世主,也没必要去拯救世人。可怜之人,必有可恨之处,谨记;  24:不要轻易借钱给别人,借钱的人,许多都不想还钱; 25:要明白读过很多书的人不一定有很多知识,没上过学的人却不一定是文盲; 26:不要以貌取人,特别是女人,漂亮的也许是个魔鬼,丑陋的却可能是天使,上天总是公平的;  27:要做回自己,为自己活着;  28:要会装扮自己,邋遢不是一个酷的表现,是没教养的结果;  29:走自己的路,让NB说破嘴皮吧;  30:赚别人的钱,让贫穷见鬼去吧; 31 :在这个物竞天择,适者生存的世界里,抱怨根本起不到任何作用,公平是要自己创造给自己的。

nginx location匹配规则【转】

location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写~*    #表示执行一个正则匹配,不区分大小写^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录=      #进行普通字符精确匹配@     #”@” 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files   location 匹配的优先级(与location在配置文件中的顺序无关)= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。最后匹配理带有”~”和”~*”的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。 location 优先级官方文档 Directives with the = prefix that match the query exactly. If found, searching stops. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops. Regular […]

Nginx配置文件nginx.conf中文详解【转】

原文:http://www.ha97.com/5194.html 更详细的模块参数请参考:http://wiki.nginx.org/Main #定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数。worker_processes 8; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]error_log /var/log/nginx/error.log info; #进程文件pid /var/run/nginx.pid; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。worker_rlimit_nofile 65535; #工作模式与连接数上限events{#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。use epoll;#单个进程最大连接数(最大连接数=连接数*进程数)worker_connections 65535;}#设定http服务器http{include mime.types; #文件扩展名与文件类型映射表default_type application/octet-stream; #默认文件类型#charset utf-8; #默认编码server_names_hash_bucket_size 128; #服务器名字的hash表大小client_header_buffer_size 32k; #上传文件大小限制large_client_header_buffers 4 […]

分享给大家一个感人的小故事

转载请自觉注明原文:http://www.jq-school.com/Show.aspx?id=339   分享给关注JquerySchool网站的网友们的一个故事,希望你能喜欢这个故事并希望它能为你带来好运。 一天,一个盲人带着他的导盲犬过街时,一辆大卡车失去控制,直冲过来,盲人当场被撞死,他的导盲犬为了守卫主人,也一起惨死在车轮底下。   主人和狗一起到了天堂门前。   一个天使拦住他俩,为难地说:“对不起,现在天堂只剩下一个名额,你们两个中必须有一个去地狱。”   主人一听,连忙问:“我的狗又不知道什么是天堂,什么是地狱,能不能让我来决定谁去天堂呢?”   天使鄙视地看了这个主人一样,皱起了眉头,她想了想,说:“很抱歉,先生,每一个灵魂都是平等的,你们要通过比赛决定由谁上天堂。”   主人失望地问:“哦,什么比赛呢?”   天使说:“这个比赛很简单,就是赛跑,从这里跑到天堂的大门,谁先到达目的地,谁就可以上天堂。不过,你也别担心,因为你已经死了,所以不再是瞎子,而且灵魂的速度跟肉体无关,越单纯善良的人速度越快。” 主人想了想,同意了。   天使让主人和狗准备好,就宣布赛跑开始。她满心以为主人为了进天堂,会拼命往前奔,谁知道主人一点也不忙,慢吞吞地往前走着。更令天使吃惊的是,那条导盲犬也没有奔跑,它配合着主人的步调在旁边慢慢跟着,一步都不肯离开主人。   天使恍然大悟:原来,多年来这条导盲犬已经养成了习惯,永远跟着主人行动,在主人的前方守护着他。可恶的主人,正是利用了这一点,才胸有成竹,稳操胜券,他只要在天堂门口叫他的狗停下就可以了。   天使看着这条忠心耿耿的狗,心里很难过,她大声对狗说:“你已经为主人献出了生命,现在,你这个主人不再是瞎子,你也不用领着他走路了,你快跑进天堂吧!”   可是,无论是主人还是他的狗,都像是没有听到天使的话一样,仍然慢吞吞地地往前走,好像在街上散步似的。   果然,离终点还有几步的时候,主人发出一声口令,狗听话地坐下了,天使用鄙视的眼神看着主人。   这时,主人笑了,他扭过头对天使说:“我终于把我的狗送到天堂了,我最担心的就是它根本不想上天堂,只想跟我在一起……所以我才想帮它决定,请你照顾好它。”   天使愣住了。   主人留恋地看着自己的狗,又说:“能够用比赛的方式决定真是太好了,只要我再让它往前走几步,它就可以上天堂了。不过它陪伴了我那么多年,这是我第一次可以用自己的眼睛看着它,所以我忍不住想要慢慢地走,多看它一会儿。如果可以的话,我真希望永远看着它走下去。   不过天堂到了,那才是它该去的地方,请你照顾好它。”   说完这些话,主人向狗发出了前进的命令,就在狗到达终点的一刹那,主人像一片羽毛似的落向了地狱的方向。他的狗见了,急忙掉转头,追着主人狂奔。满心懊悔的天使张开翅膀追过去,想要抓住导盲犬,不过那是世界上最纯洁善良的灵魂,速度远比天堂所有的天使都快。   所以导盲犬又跟主人在一起了,即使是在地狱,导盲犬也永远守护着它的主人。   天使久久地站在那里,喃喃说道:“我一开始就错了,这两个灵魂是一体的,他们不能分开……”    最后,我要说:这个世界上,真相只有一个,可是在不同人眼中,却会看出不同的是非曲直。这是为什么呢?其实,道理很简单,因为每个人看待事物,都不可能站在绝对客观公正的立场上,而是或多或少地戴上有色眼镜,用自己的经验、好恶和道德标准来进行评判,结果就是——我们看到了假象。   “友谊的幸福之一,是知道了可以向谁倾吐秘密。”如果你收到了这封信,是因为有人在默默的祝福你,因为你也爱你身边的一些人。   如果你总说太忙,不能将这封信转寄出去,老是说:”改天再寄。”你将永远都不会去做这件事的。   所以,不要找借口,静心的看看这篇古老印度来的故事,然后决定为你的朋友们作一些事,从传寄这封信开始。当你说:”你是我的好朋友”时,请认真的说出来。当你道歉时请看着对方的眼睛。  

Java编程最差实践【转】

原文:http://macrochen.iteye.com/blog/1393502 每天在写Java程序, 其实里面有一些细节大家可能没怎么注意, 这不, 有人总结了一个我们编程中常见的问题. 虽然一般没有什么大问题, 但是最好别这样做. 另外这里提到的很多问题其实可以通过Findbugs(http://findbugs.sourceforge.net/ )来帮我们进行检查出来. 字符串连接误用  错误的写法:  Java代码   String s = “”;   for (Person p : persons) {       s += “, ” + p.getName();   }   s = s.substring(2); //remove first comma    正确的写法:  Java代码   StringBuilder sb = new StringBuilder(persons.size() * 16); // well estimated buffer   for (Person p : persons) {       if (sb.length() > 0) sb.append(“, ”);       sb.append(p.getName);   }   错误的使用StringBuffer  错误的写法:  Java代码   StringBuffer sb = new StringBuffer();   sb.append(“Name: ”);   sb.append(name + ‘\n’);   sb.append(“!”);   …   String s = sb.toString();   问题在第三行, append char比String性能要好, 另外就是初始化StringBuffer没有指定size, 导致中间append时可能重新调整内部数组大小. 如果是JDK1.5最好用StringBuilder取代StringBuffer, 除非有线程安全的要求. 还有一种方式就是可以直接连接字符串. 缺点就是无法初始化时指定长度.  正确的写法:  Java代码   StringBuilder sb = new StringBuilder(100);   sb.append(“Name: ”);   sb.append(name);   sb.append(“\n!”);   String s = sb.toString();   或者这样写:  Java代码   String s = “Name: ” + name + “\n!”;   测试字符串相等性  错误的写法:  Java代码   if (name.compareTo(“John”) == 0) …   if (name == “John”) …   if (name.equals(“John”)) …   if (“”.equals(name)) …   上面的代码没有错, 但是不够好. […]

JPQL简易教程【转】

网址: http://openkoala.org/pages/viewpage.action?pageId=2163087 1、  排序 ASC和DESC分别为升序和降序,如果不显式指定,JPQL 默认使用 ASC 升序。 1)先按年龄排序,然后按出生日期升序排序 select p from Person p order by p.age desc,p.birthday asc   2、  查询部分属性 JPQL 允许查询返回我们需要的成员属性,而不是实体对象。 在一些实体成员属性比较多的情况,这样的查询可以提高性能。 查询出来的集合元素不是Person,而是一个Object[]对象数组 select p.name,p.age from Person p   3、  查询中使用构造函数 JPQL支持将查询的结果直接作为一个java类的构造器参数, 并产生类对象作为结果返回。 select new org.foreveross.PersonVO(p.name,p.age) from Person p   4、  聚合查询 像大部分的 SQL一样,JPQL也支持查询中的聚合函数。目前JPQL支持的聚合函数包括:1. AVG() 求平均数,返回值类型为 Double。2. SUM() 求和,返回值类型为被求值的成员属性所对应的类型。3. COUNT() 统计, 返回类型为 Long, […]

java jvm defaultCharset问题【转】

原文:http://blog.csdn.net/bxyz1203/article/details/7352864 一、问题描述 在写代码的时候,读取字节流的时候,一般需要转化成 字符串,此时就涉及到编码问题。 一般文件是用啥 编码 存的,取的时候就用 此编码读取。 在写读的时候,一般建议指定编码。 BufferedReader br = new BufferedReader(new InputStreamReader(is));最好写成 BufferedReader br = new BufferedReader(new InputStreamReader(is,encoding)); encoding一般需要猜测文件的编码。嘿嘿。。。。 【如果没有指定编码,系统是如何读取编码的呢?】 http://docs.oracle.com/javase/1.5.0/docs/api/java/nio/charset/Charset.html#defaultCharset() defaultCharset是默认编码,依赖于本地。( 可以如此来指定:-Dfile.encoding=GBK) 【如果 也没有用-Dfile.encoding指定呢?】 则会依赖于locate 时区文档:http://java.sun.com/developer/technicalArticles/J2SE/locale/ 系统的代码如下:【请用openjdk查看Charset类,大约580行】 源码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/nio/charset/Charset.java#Charset   private static volatile Charset defaultCharset;     /**      * Returns the default charset of this Java virtual machine.      *      * <p> […]

程序员困境:底层编码能力正逐步丧失

不同的公司环境会培养出不同的员工,程序员也不例外,由于大公司的开发框架十分成熟,稳定,而且充满盈利能力,所以开发者容易陷入拿来主义思维,而底层代码的编写能力正在逐渐退化。    前段时间,@developerworks在微博上向大家推荐了一篇引人深思的文章《程序员困境》,这篇文章的作者描述了在招聘内核程序员时所遇到的一个现象,一些来自大公司的“高级”程序员,却连最简单最基本的问题都无法回答,这不禁引发了作者的思考,下面是笔者的简译: 最近,我为招聘内核程序员而面试了数万个应聘者,有一些是来自有名的大公司,比如非常有名的芯片/嵌入式系统开发公司。许多人的简历制作的非常完美——涉及的各种项目、获得的各种奖项等,并有一些人声称,他们在内核研发上有10多年的工作经验,然而,令人惊奇地是,他们却无法回答一些基本的问题:当调用标准的malloc函数时,内核发生了什么? 别吃惊,当我让一个应聘者编写一个基于glib哈希函数的LRU缓存框架时,他首先声称自己从未使用过glib,于是我向他演示glib哈希API页面,并且详细地解释,然而一个小时后,他只写了几行凌乱的代码。我不知道在其它国家是否会有类似的情形,但在中国,或者更具体地说,在北京,这就是现实。那些“高级”程序员,在有名的外企工作几年后,连一些简单的、基本的问题都无法实现。 为什么? 我愈加思考就愈加认为,这不仅仅是与程序员自身有关,更与其所在的公司环境有关。这些公司通常会提供稳定的堆栈代码,并且多年来一直沿用着,几行没有任何变化。程序员整天围绕着这些代码工作,按照已有的思路去开发,无需自己动脑、去思考。如果长期在这样的环境下工作,并且也没有在外部进行提升和开阔,多年以后,你会发现自己处于很可怜的位置——在公司内部或团队里声称是“专家”,然而不幸地是,你却不能在市场找到一个与之平等的工作。 这就是所谓的“专家陷阱”。在当程序员的第一天,我们就梦想着成为团队/公司的专家,然而,当这一天到来,大家却陷入了困惑。越深入到当前的代码中,陷的就越深。渐渐地,我们丧失了那种从头开始创建完整项目的能力,因为现有的代码如此稳定。更糟糕的是,如果我们的主要工作仅仅是维护现有的代码,带有一些细微的功能添加和改善,一段时间后,无论你读过或学习过多么牛逼的代码,你将会发现自己不再会写代码——甚至是刚毕业那种简单的代码。这就是程序员困境:我们通过编码谋生,但环境却正在摧毁我们这种谋生的能力。 如何跳出困境 对程序员个人来说,首先,做自己的项目;其次不要待在同一团队超过两年时间。 给团队/公司的建议,给员工压力和挑战:轮流工作,让“专家”有机会拓宽自己的技能。定期举行黑客马拉松:这将有助于创建一个拥抱创新和创造的文化氛围。 对此,各位程序员,你们又是持何种观点呢?本文作者主要描述了程序员在大公司所面临的问题,你们身处的环境如何呢?不妨和我们一起分享下吧。   原文地址:http://www.iteye.com/news/28193

跟你的WordPress垃圾评论(Spam)说88

转自:http://www.xp-sem.com/wordpress-spam-clear/ 对WordPress用户来说,最恶心的莫过于垃圾评论这码子事了。垃圾评论无孔不入,你几乎没办法杜绝,除非彻底关闭WordPress的评论功能。可是,一个缺乏互动性、死气沉沉地网站,用户体验方面又是欠佳的。今天,小拼就教你如何防范WordPress的垃圾评论,坚决抑制Spam泛滥。 1)WordPress安装Akismet插件 Akismet(Automattic Kismet)是WordPress的自带插件之一,它几乎可以帮你过滤所有垃圾留言和评论。使用Akismet也非常简单,你只需在WordPress后台的插件管理里启用它。当然,在使用Akismet之前,你需要去Akismet官网获取API Key,一般来说,我们使用Akismet个人版就足够了,主要它完全免费。 小拼SEM博客自启用Akismet后,短短一个半月,Akismet竟过滤了7,749条垃圾评论!不难发现,Akismet是一款非常强大地垃圾留言过滤系统,毕竟Akismet的作者也是WordPress的NX创始人Matt Mullenweg。 2)WordPress安装Comments Link Redirect插件 Comments Link Redirect是水煮鱼在Shawn基础上完善的防Spam插件,一定程度上来说,它是Akismet很好的补充。 Comments Link Redirect主要功能就是把Spam中的超链接(留言者网址和留言内容URL)转换成一个跳转链接,形如: http://www.xp-sem.com/?redirect=http://www.spam.com 这样做有一个好处,即把所有的人的留言或评论超链接转换成?redirect=跳转形式,也是方便我们去屏蔽它。事实上,很多网站已经在这么做了,比如腾讯微博、搜搜问问等,对一些敏感的URL都进行了转义,也是防止Spam的疯狂蔓延。不过,小拼不建议安装Comments Link Redirect插件,多少会影响到WordPress的系统性能。那么,非插件应该如何设置呢?很简单,打开你的WordPress主题目录下的functions.php,随便找个空位置加入如下代码: //this is start //comments link redirect add_filter(‘get_comment_author_link’, ‘add_redirect_comment_link’, 5); add_filter(‘comment_text’, ‘add_redirect_comment_link’, 99); function add_redirect_comment_link($text = ”){ $text=str_replace(‘href=”‘, ‘href=”‘.get_option(‘home’).’/?redirect=’, $text); $text=str_replace(“href=’”, “href=’”.get_option(‘home’).”/?redirect=”, $text); return $text; } add_action(‘init’, ‘redirect_comment_link’); function redirect_comment_link(){ $redirect = $_GET['r']; if($redirect){ if(strpos($_SERVER['HTTP_REFERER'],get_option(‘home’)) […]