nowhatyousaybutyoudomattrssay hi是什么意思思

i just called to say i love you_百度百科
关闭特色百科用户权威合作手机百科
收藏 查看&i just called to say i love you本词条缺少概述、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!歌曲原唱史提夫·汪达歌曲语言英语
美国黑人盲歌手Stevie Wonder()演唱歌曲,1984年。曾用于美国电影《》中。歌曲中文翻译为《》。这首歌不仅是当年全美全英排行榜冠军,而且还获得1984年第57届。I Just Called to Say I Love You
No new years's day
to celebrate
no chocolate covered candy hearts to give away
no first of spring
no song to sing
in fact here's just another ordinary day
No April rain
no flowers bloom
no wedding saturday within the month of June
But what it is
Is something true
Made up of these three words that I must say to you
I just called to say I love you
I just called to say how much I care
I just called to say I love you
And I mean it from the bottom of my heart
No summer's high
No warm July
No harvest moon to light one tender August night
No autumn breeze
No falling leaves
No even time for birds to fly to southern skies
No libra sun
No Halloween
No giving thanks to all the Christmas joy you bring
But what it is
Though old so new
To fill your heart like no three words Could ever do
I just called to say I love you
I just called to say I love you
I just called to say how much I care
I just called to say I love you
And I mean it from the bottom of my heart
I just called to say I love you
I just called to say how much I care
I just called to say I love you
And I mean it from the bottom of my heart没有元旦庆贺新年, 没有欢天喜地分送糖果糕点;
没有春天,没有诗篇, 只有往常一样,只是平平常常一天。
但我要在电话中,我要说我爱你。
电话中,我说天天思念。
电话中,我说我爱你。
这些话都是出自我肺腑间。
我爱你!我爱你!
没有四月绽开花瓣,
没有六月周末举办婚礼盛筵。
但只有我想说心中真情,
我要对你说出心中三个字眼。
电话中,我说我爱你。
电话中,我说天天思念。
电话中,我说我爱你。
这些话都是出自我肺腑间。
我爱你!我爱你!
没有七月烈日炎炎,
没有中秋一轮明月照遍人寰;
没有是秋风吹落黄叶,
没有是天边大雁南飞,季节更换。
只有在电话中,我说我爱你。
只有电话中,我说天天思念。
电话中,我说我爱你。
这些话都是出自我肺腑间。
我爱你!我爱你!
没有吉庆或万圣节,
没有祝贺圣诞快乐,送礼寒暄。
虽然古老,却又新鲜,
但愿这三个字长留在你心间。
电话中,我说我爱你。
电话中,我说天天思念。
电话中,我说我爱你。
这些话都是出自我肺腑间。
我爱你!我爱你!《》虽说是一首情歌,但结合这位歌手的身世来看,歌曲中描绘的场景都是他不曾看到的,歌曲中的“你”不妨视做一切美好事物的象征。命运注定他要在黑暗中度过一生,但是从他的歌声中,我们可以感受到他心中一片光明。[1]Stevie Wonder(),美国黑人盲歌手,作曲家,音乐制作人,社会活动家。唱片销售量超过7000万张,创作了大量脍炙人口的音乐作品。擅长多种乐器,如电子琴,钢琴等键盘乐器,口琴,鼓,吉他等。他是一位唱乐皆精Stevie Wonder的全能艺人。
1963年,13岁的Stevie以一曲《Fingertips》夺取单曲榜排行冠军3周,震动了整个乐坛。
1971年,Stevie推出专辑《Music of My Mind》,取得不俗成绩。
1972年,他又推出了《Superstition》赢得:“黑白乐迷”的热烈反响。
1973年的交通事故后,一次为契机,开始投身于慈善与和平事业。曾演唱歌曲反对南非种族隔离制度,另有歌曲赞颂黑人运动领袖。
1976年,推出《Song in the Key of Life》蝉联排行榜冠军达14周之久,可谓乐坛奇迹。
1980年,Steive发行了《Hotter than July》,此专辑成为他的第一张白金专辑。
1984年,“I Just Called to Say I Love You”红遍英美大洋两岸。
1985年,Steive与MJ一同参与赈济非洲饥民的大型慈善歌曲《We Are the World》的录制,并在此曲的演出中有相当长的出场时间。
1987年,在的澳大利亚Parramatta Stadium的“Bad”演唱会上,作为演唱嘉宾。
2005年,Steive在沉寂了近20年再度出击乐坛,推出《A Time To Live》,并因此夺得第48届格莱美最佳流行男歌手。
2009年,Wonder在接受新任总统奥巴马授予的国会对流行音乐家的大奖奖。
到目前为止有9首单曲成为美国年度排行冠军曲,获得过“最佳R&B男歌手”、“最佳流行男歌手”、“最佳专辑”等22座,及一座奥斯卡最佳电影歌曲奖,及2004年度公告牌奖(Billboard)之世纪成就奖。(Century Award)。被称为美国乐坛一致公认的“国家一级人物”。
新手上路我有疑问投诉建议参考资料 查看but i can't tell you ,if i say imust be go to die i courageo us ,but i fear there is no person lovei like you but
i can't tell you ,if i say imust be go to die i courageo us ,but i fear there is no person love you beat me 这些是什么意思,麻_作业帮
but i can't tell you ,if i say imust be go to die i courageo us ,but i fear there is no person lovei like you but
i can't tell you ,if i say imust be go to die i courageo us ,but i fear there is no person love you beat me 这些是什么意思,麻
but i can't tell you ,if i say imust be go to die i courageo us ,but i fear there is no person lovei like you but
i can't tell you ,if i say imust be go to die i courageo us ,but i fear there is no person love you beat me 这些是什么意思,麻烦懂英文的帮我翻译一下,谢谢了!
我喜欢你但我不能告诉你,如果我说,我就必须去死,我们要有胆量,但我害怕没人爱你而打击到我.朋友,上述仅供参考.因为你给的句子语法错误较多.
我喜欢你,可是不敢告诉你,如果我鼓足勇气,说了我一定会死,但我又怕没人会比我更爱你。
我喜欢你,但是我不能告诉你,如果我说了我将会去死,我鼓励自己,但是我害怕没有人爱我,你让我心跳。
这个句子读起来貌似有点问题。。。这个根据我的意译来看呢,这个句子可能是:我喜欢你,但我不能告诉你,如果我说了,那我就必须去死。我是一个胆大的人(死并不可怕),但是我怕的是我死了之后没有人可以代替我来爱你。
但是我不可以告诉你,如果我说了我必须得死ng的内置过滤器
  ng内置了九种过滤器,使用方法都非常简单,看文档即懂。不过为了以后不去翻它的文档,我在这里还是做一个详细的记录。
  1. currency (货币处理)
  使用currency可以将数字格式化为货币,默认是美元符号,你可以自己传入所需的符号,例如我传入人民币:
{{num | currency : ‘¥’}}
  2. date (日期格式化)
  原生的js对日期的格式化能力有限,ng提供的date过滤器基本可以满足一般的格式化要求。用法如下:
{{date | date : ‘yyyy-MM-dd hh:mm:ss EEEE’}}
  参数用来指定所要的格式,y M d h m s E 分别表示 年 月 日 时 分 秒 星期,你可以自由组合它们。也可以使用不同的个数来限制格式化的位数。另外参数也可以使用特定的描述性字符串,例如“shortTime”将会把时间格式为12:05 pm这样的。ng提供了八种描述性的字符串,个人觉得这些有点多余,我完全可以根据自己的意愿组合出想要的格式,不愿意去记这么多单词~
  3. filter(匹配子串)
  这个名叫filter的filter(不得不说这名字起的,真让人容易混淆——!)用来处理一个数组,然后可以过滤出含有某个子串 的元素,作为一个子数组来返回。可以是字符串数组,也可以是对象数组。如果是对象数组,可以匹配属性的值。它接收一个参数,用来定义子串的匹配规则。下面 举个例子说明一下参数的用法,我用现在特别火的几个孩子定义了一个数组:
$scope.childrenArray = [ {name:'kimi',age:3}, {name:'cindy',age:4}, {name:'anglar',age:4}, {name:'shitou',age:6}, {name:'tiantian',age:5} ];$scope.func = function(e){return e.age&4;}
{{ childrenArray | filter : ‘a’ }} //匹配属性值中含有a的{{ childrenArray | filter : 4 }} //匹配属性值中含有4的{{ childrenArray | filter : {name : ‘i’} }} //参数是对象,匹配name属性中含有i的{{childrenArray | filter : func }} //参数是函数,指定返回age&4的
  4. json(格式化json对象)
  json过滤器可以把一个js对象格式化为json字符串,没有参数。这东西有什么用呢,我一般也不会在页面上输出一个json串啊,官网说它 可以用来进行调试,嗯,是个不错的选择。或者,也可以用在js中使用,作用就和我们熟悉的JSON.stringify()一样。用法超级简单:
{{ jsonTest | json}}
  5. limitTo(限制数组长度或字符串长度)
  limitTo过滤器用来截取数组或字符串,接收一个参数用来指定截取的长度,如果参数是负值,则从数组尾部开始截取。个人觉得这个filter有点鸡肋,首先只能从数组或字符串的开头/尾部进行截取,其次,js原生的函数就可以代替它了,看看怎么用吧:
{{ childrenArray | limitTo : 2 }} //将会显示数组中的前两项
  6. lowercase(小写)
  把数据转化为全部小写。太简单了,不多解释。同样是很鸡肋的一个filter,没有参数,只能把整个字符串变为小写,不能指定字母。怎么用我都懒得写了。
  7. uppercase(大写)
  同上。
  8. number(格式化数字)
  number过滤器可以为一个数字加上千位分割,像这样,123,456,789。同时接收一个参数,可以指定float类型保留几位小数:
{{ num | number : 2 }}
  9. orderBy(排序)
  orderBy过滤器可以将一个数组中的元素进行排序,接收一个参数来指定排序规则,参数可以是一个字符串,表示以该属性名称进行排序。可以是 一个函数,定义排序属性。还可以是一个数组,表示依次按数组中的属性值进行排序(若按第一项比较的值相等,再按第二项比较),还是拿上面的孩子数组举例:
{{ childrenArray | orderBy : ‘age’ }}
//按age属性值进行排序,若是-age,则倒序
{{ childrenArray | orderBy : orderFunc }}
//按照函数的返回值进行排序
{{ childrenArray | orderBy : ['age','name'] }}
//如果age相同,按照name进行排序
// 弹出警告服务
angular.module(‘KTPLAY’).run(['$http', '$templateCache', function($http, $templateCache){
&var template = $templateCache.get('templates/services/kt_alert.html');
&if(!template){
& $http.get('/templates/services/kt_alert.html').success(function(html){
& &template =
& &$templateCache.put('templates/services/kt_alert.html', template);
}]).factory(‘KtAlert’, ['$compile', '$templateCache', '$rootScope', '$timeout', function ($compile, $templateCache, $rootScope, $timeout) {
&function generateUI(conf){
& var scope = $rootScope.$new();
& var template = $templateCache.get('templates/services/kt_alert.html');
& var linkup = $compile(template)
& var ui = linkup(scope);
& $(ui).appendTo('body');
& var container = $(ui).find('.kt-alert-container:first')
& container.css({
& &left: ($('body').width()-container.width())*0.5
& for (var i in conf) {
& &scope[i] = conf[i];
& function alertClose(){
& &// console.log(ui);
& &scope.$destroy();
& &ui.remove();
& scope.alertClose = alertC
& $timeout(function() {
& &alertClose();
& }, 5000);
& success: function(msg){
& &generateUI({
& & status: ‘success’,
& & message: msg
& error: function(msg){
& &generateUI({
& & status: ‘error’,
& & message: msg
& warning: function(msg){
& &generateUI({
& & status: ‘warning’,
& & message: msg
}]).directive(‘ktAlertSuccess’, [ function () {
& restrict: 'AE',
& replace: true,
& templateUrl: 'templates/services/kt_alert.html',
& transclude: true,
& scope: {
& link: function(scope, element, attrs, ctrl) {
& &scope.status = 'warning';
& &scope.alertClose = function(){
& & scope.$destroy();
& & element.remove();
}]).directive(‘ktAlertError’, [ function () {
& restrict: 'AE',
& replace: true,
& templateUrl: 'templates/services/kt_alert.html',
& transclude: true,
& scope: {
& link: function(scope, element, attrs, ctrl) {
& &scope.status = 'warning';
& &scope.alertClose = function(){
& & scope.$destroy();
& & element.remove();
}]).directive(‘ktAlertWarning’, [ function () {
& restrict: 'AE',
& replace: true,
& templateUrl: 'templates/services/kt_alert.html',
& transclude: true,
& scope: {
& link: function(scope, element, attrs, ctrl) {
& &scope.status = 'warning';
& &scope.alertClose = function(){
& & scope.$destroy();
& & element.remove();
AngularJS指令进阶 – ngModelController详解
在自定义Angular指令时,其中有一个叫做require的字段,这个字段的作用是用于指令之间的相互交流。举个简单的例子,假如我们现在需要编写两个指令,在linking函数中有很多重合的方法,为了避免重复自己(著名的DRY原则),我们可以将这个重复的方法写在第三个指令的controller中,然后在另外两个需要的指令中require这个拥有controller字段的指令,最后通过linking函数的第四个参数就可以引用这些重合的方法。代码的结构大致如下:
var app = angular.modeule('myapp',[]);app.directive('common',function(){return{...
controller:function($scope){
this.method1 =function(){};
this.method2 =function(){};},...}});app.directive('d1',function(){return{...
require:'?^common',
link:function(scope,elem,attrs,common){
scope.method1 = common.method1;..},...}});app.directive('d2',function(){return{...
require:'?^common',
link:function(scope,elem,attrs,common){
scope.method1 = common.method1;..},...}});
当然,上面例子只是指令中controller用法的一种。虽然一般来说,使用controller字段的机会不是很多,但是想要写好AngularJS的指令,这是必须要掌握的一点。
显然,controller的用法分为两种情形,一种是require自定义的controller,由于自定义controller中的属性方法都由自己编写,使用起来比较简单;另一种方法则是require AngularJS内建的指令,其中大部分时间需要require的都是ngModel这个指令。很多时候,由于我们对ngModel中内建的方法和属性不熟悉,在阅读和编写代码时会有一些困难。今天我们的目的就是详细的介绍ngModel中的内建属性和方法,相信在认真的阅读完本文之后,你一定能够熟练的在指令中require ngModel。
在Angular应用中,ng-model指令时不可缺少的一个部分,它用来将视图绑定到数据,是双向绑定魔法中重要的一环。ngModelController则是ng-model指令中所定义的controller。这个controller包含了一些用于数据绑定,验证,CSS更新,以及数值格式化和解析的服务。它不用来进行DOM渲染或者监听DOM事件。与DOM相关的逻辑都应该包含在其他的指令中,然后让这些指令来试用ngModelController中的数据绑定功能。
下面,我们将用一个例子来说明如何在自定义指令中require ngModel。在这里例子中,我们使用HTML5中的contenteditable属性来制作了一个简单的编辑器指令,同时将在指令定义中require了ngModel来进行数据绑定。
& span&form name="myForm"&& span&div contenteditable
name="myWidget" ng-model="userContent"
strip-br="true"
required&Change me!& span&/div&& span&span ng-show="myForm.myWidget.$error.required"&Required!& span&/span&& span&hr&& span&textarea ng-model="userContent"&& span&/textarea&& span&/form&
指令定义部分
angular.module(‘customControl’, []).
directive(‘contenteditable’, function() {
restrict: ‘A’, // 作为元素属性
require: ‘?ngModel’, // 获取ngModelController
link: function(scope, element, attrs, ngModel) {
if(!ngModel) // 如果没有ng-model则什么都不做
// 指定UI的更新方式
ngModel.$render =function(){
element.html(ngModel.$viewValue ||'');}; // 监听change事件来开启绑定
element.on('blur keyup change',function(){
scope.$apply(read);});read(); // 初始化 // 将数据写入modelfunctionread(){var html = element.html(); // 当我们清空div时浏览器会留下一个标签 // 如果制定了strip-br属性,那么标签会被清空if( attrs.stripBr && html ==''){
html ='';}
ngModel.$setViewValue(html);}}};
ngModelController方法
当视图需要更新的时候会被调用。使用ng-model的指令应该自行实现这个方法。
该方法用于判断输入值是否为空。
例如,使用ngModelController的指令需要判断其中是否有输入值的时候会使用该方法。该方法可用来判断值是否为undefined,”,null或者NaN。
你可以根据自己的需要重载该方法。
该方法用于改变验证状态,以及在控制变化的验证标准时通知表格。
这个方法应该由一个验证器来调用。例如,一个解析器或者格式化函数。
该方法用于设置控制到原始状态。
该方法可以移除’ng-dirty’类并将控制恢复到原始状态(‘ng-pristine’类)。
该方法用于取消一次更新并重置输入元素的值以防止$viewCalue发生更新,它会由一个pending debounced事件引发或者是因为input输入框要等待一些未来的事件。
如果你有一个使用了ng-model-options指令的输入框,并为它设置了debounced事件或者是类似于blur的事件,那么你可能会碰到在某一段时间内输入框中值和ngModel的$viewValue属性没有保持同步的情况。
在这种情况下,如果你试着在debounced/future事件发生之前更新ngModel的$modelValue,你很有可能遇到困难,因为AngularJS的dirty cheching机制实际上并不会分辨一个模型究竟有没有发生变化。
$cancelUpdate()方法应该在改变一个输入框的model之前被调用。记住,这很重要因为这能够确保输入字段能够被新的model值更新,而pending操作将会被取消。下面是一个例子:
& span&form name="myForm" ng-model-options="{ updateOn: 'blur' }"&& span&p&With $cancelUpdate()& span&/p&& span&input name="myInput1" ng-model="myValue" ng-keydown="resetWithCancel($event)"&& span&br/&myValue:"{{ myValue }}"& span&p&Without $cancelUpdate()& span&/p&& span&input name="myInput2" ng-model="myValue" ng-keydown="resetWithoutCancel($event)"&& span&br/&myValue:"{{ myValue }}"& span&/form&& span&/div&
angular.module('cancel-update-example',[]).controller('CancelUpdateCtrl',function($scope){
$scope.resetWithCancel =function(e){if(e.keyCode ==27){
$scope.myForm.myInput1.$cancelUpdate();
$scope.myValue ='';}};
$scope.resetWithoutCancel =function(e){if(e.keyCode ==27){
$scope.myValue ='';}};});
ngModelController中的属性
只要视图的值发生变化,其中的函数就会被执行。其中的函数执行并不带参数,它的返回值也会被忽略。它可以被用在额外的#watches中。
一个包含所有error的对象
如果用户还没有进行过交互,值是true。
如果用户已经进行过交互,值是true。
如果没有错误,值是true。
如果有错误,值是true。
本文参考自AngularJS文档,原文地址
如果你觉得本文对你有帮助,请为我提供赞助
&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&&/span&
Mi?ko Hevery,也就是AngularJS的作者,曾经在一个演讲中谈到指令,他说在用户自定义指令时,compile几乎不会被用到,它仅仅在相识ng-repeat和ng-view这样的指令中才会用到。因此,我们现在的问题是:ng-repeat是如何运行的?
在继续深入之前,我们先来复习一些transclusion这个可选项。Transclude有两个可选项:
2.’element’
首先我们来看看translude:true:
div person&Ted/div&
app.directive('person',function(){return{
transclude:true,
template:"A person",
link:function($scope,$element,$attr){ //some code}}});
指令运行的结果如下:
h1&A Person/h1&div ng-transclude&span class='ng-scope'&Ted/span&/div&
在上面的例子中,tranclude:true告诉Angular来接受DOM元素的内容,使用这个指令,并将它们插入到person的template中。为了指明模板的那一部分将用来插入DOM内容,我们需要在模板汇总包含ng-transclude指令。而span标签,连同ng-scope类则是由AngularJS自动插入的。
和上面的例子相比,在ng-repeat指令中,并不包含一个模板用于插入DOM内容。因此,ng-repeat将会设置transclude: ‘element’,来表明调用ng-repeat的DOM元素将会用于transclusion。
在下面,我们会自己实现一个与ng-repeat功能很相似的指令叫做lk-repeat,它运行的结果和用法同ng-repeat完全一样。下面是HTML代码部分:
ul&li lk-repeat="name in names"&{{name}}/li&/ul&
下面是指令定义的部分:
var app = angular.module('myApp',[]);app.directive('lkRepeat',function(){return{
transclude:'element',
compile:function(element,attar,linker){returnfunction($scope,$element,$attr){var myLoop = $attr.lkRepeat,
match = myLoop.match(/^s*(.+)s+ins+(.*?)s*(s+tracks+bys+(.+)s*)?$/),
indexString = match[1],
collectionString = match[2],
parent = $element.parent(),
elements =[]; //每次collection被修改时$watchCllection都会被调用
$scope.$watchCollection(collectionString,function(collection){var i,block,childScope; //检查元素是否已经被渲染了
if(elements.length &0){ //如果为真将它们从DOM中移除,并销毁它们的scope
for(i=0;ielements.length;i++){
elements[i].el.remove();
elements[i].scope.$destory();};
elements =[];}for(i=0;icollection.length;i++){ //对这个collection中每个元素创建一个新scope
childScope = $scope.$new();
childScope[indexString]= collection[i];linker(childScope,function(clone){
parent.append(clone);//添加到DOM中
block ={};
block.el = clone;
block.scope = childScope;
elements.push(block);});}});}}}});
每一次当collection发生更新时,你注意到了所有的元素以及它们的scope都从DOM中被移除了。虽然这对于阅读代码来说很有好处,但是这样每次全部移除由重新添加的做法是非常没有效率的。在真实版本的ng-repeat中,只有从collection被移除的元素才会从DOM中被移除。另外,如果有一个项目在集合中改变了位置(比如从第二变为了第四),它并不需要一个新的scope,但是它需要在DOM中发生移动。
本文参考自Understanding AngularJS Directives Part 1: Ng-repeat and Compile,原文地址
如果你觉得本文对你有帮助,请点击为我
angular的核心思想是通过数据驱动一切,其他东西都是数据的延伸.套用Javascript一切皆对象的思想,在angular中可以说一切皆数据.
关于项目构建
&(1) requirejs以及Yeoman
&&&&在刚开始接触或者使用Angular的时候,总会疑惑与类似的问题,我实践的答案是不需要requirejs或者Yeoman.前者不使用,因为angular本身有module的实现.后者是因为Angular组织结构以及项目构建完全不必要弄得如此繁杂,手写或者在github上pull一个seed项目即可.
(2) 如何组织项目结构
&&&&这个问题有点废材,因为完全因人因项目而异.个人推荐的是两种组织结构,一种按照代码功能,也就是controller都放在一个文件夹下,services都放在一个文件夹下.另一种则遵循所实现的功能,比如User就把对应的template,services,controller都放在User文件夹下.
&&&&两种都可以,从维护角度上看第二种会更好一些.
(3) controller以及service的划分
&&&&这里controller通常就是一个页面一个controller,假如一个页面有公共的部分,公共部分永远使用一个controller.对于service要划分成两个部分,一个是于服务器交互数据的service,另一个是一些功能性common的内容,其中放置一些自己写的可复用的服务,类似于notify等.
&&&&至于service要不要按照功能和模块再进一步划分,这个就看项目来了.
(4) Angular插件以及库的使用
&&&&对于一个项目所有的东西都去网上拿现成的肯定不现实,但是所有的东西都自己写就更不实际了.Angular的很多插件是由Angular团队开发出来或者一些人用jquery插件封装的.我对于插件的观点很简单,如果拿来用赶紧需求可以满足就用,不能满足就自己写或者在已有插件上改进.
&&&&对于如果你调试几个小时还搞不定的插件,听我的劝,放弃它吧.大多数插件都是一些UI插件,大可不必追求繁杂,有时候简简单单的HTML控件也自有它简约的美.
&&&&如果你遇到Angular插件冲突,尤其是UI插件,大多数的情况下要放弃其中之一,比如angular-ui和angular-strap.
& 使用技巧
&&&&下面进入正文,我会列举出我在使用angular的过程中使用的一些技巧,会以场景的形式一一列举.这里对于Angular的一些基础概念我不会解释,本文是一些技巧性的东西,不是基础教程.
(1) angular中”{{}}”于Python的flask冲突
&&&&Python的flask使用的模板中,数据绑定也是通过两个”{“大括号,这就于angular的数据绑定有冲突.这个有两种解决方法,一种是修改angular的绑定标记,另一种就是修改flask的绑定标记,这里两种方案都给出.
&&&&修改angular:
$interpolateProvider.startSymbol(
).endSymbol(
//&将这句话加在config中即可,放在route的module中即可.这里将原来angular的{{&}}绑定,修改为通过{[{&}]}绑定.
&&&&修改flask:
CustomFlask(Flask):
jinja_options&=&Flask.jinja_options.copy()
jinja_options.update(dict(
block_start_string=
block_end_string=
variable_start_string=
variable_end_string=
comment_start_string=
comment_end_string='#&',
app&=&CustomFlask(__name__,&instance_path='/web')
&&&&这里我推荐修改flask,因为用了angular之后,前后端分离.flask的jinjia模板不再需要,同时如果你修改了Angular的绑定标记,其他的控件和库会有问题的.
(2) 去除url中总是默认带有”#”
&&&&在设置route的时候,开启HTML5模式.
angular.module(
'$routeProvider'
'$locationProvider'
($routeProvider,&$locationProvider)&{
$locationProvider.html5Mode(
//&设置一下这句即可
(3) ng-click=”expression”以及类似的指令,如何在expression中书写多个表达式?
&&&&比如我在一个ng-click中想要给2个变量赋值,通过”;”分号分割即可:
"obja=1;objb=2"&
(4)&$watch没有产生作用或者只生效一次
&&&&这种情况一般来说是监听一个字符串或者数字的时候会出现,$scope.$watch(“name”,function(){}).没有生效或者只生效一次,解决方法是$watch尽量监听的是一个对象,将你要监听的值附在一个Object下即可.
&&&&当你使用angular-ui中的modal时,这个比较明显.
(5) 希望ng-view的内容全页面显示
&&&&通常一个页面可能会有固定的top-menu或者sidebar,这类固定不变的部分,然后每次route变化的都是ng-view的template,如果一个页面希望整个页面完全显示它自己,不包括top-menu之类固定的部分.
&&&&这里通常是一个index.html和一个ng-view显示的template.html,top-menu和sidebar位于index.html中,将它们的显示隐藏通过ng-if绑定一个变量控制.
&&&&如果一个页面需要自己完全显示,不显示sidebar等,则在其controller中通过$scope.$emit向上发送一个消息,然后index页面的controller则通过$scope.$on监听消息,一旦听到那个消息,则改变控制sidebar显隐的变量.
&&&&也可以通过service做一个全局的变量控制,个人推荐还是通过消息广播的方式.
(6) 切记用ng-if代替ng-show
&&&&这是angular的一个小坑,也可以说是不大不小的一个坑.一些长列表数据,可能有一些东西是通过默认隐藏,点击显示的形式展现的.而这部分可控制显隐的内容中也会伴随很多数据绑定.这个在页面渲染的时候非常影响性能.
&&&&举一个列子,比如说通常angular建议一个页面的数据绑定不超过2000个,假如现在有一个页面直接绑定了2000个model,然后你加载,会发现非常卡.如果你将每100的model设置为ng-show,默认情况下不显示,你会发现还是很卡.
&&&&然后你将所有的ng-show换成ng-if,你会发现性能瞬间快的像两个应用.原因在ng-show还是会执行其中的所有绑定,ng-if则会在等于true,也就是显示的时候再去执行其中的绑定.这样一来性能就有很大的提高,我之前通过这个简单的修改,页面加载快了10倍左右.
&&&&所以在能使用ng-if的情况,用它代替所有的ng-show和ng-hide吧.
(7) 关于ng-bind-html
&&&&通常情况下为html元素绑定数据,有ng-bind就够了,但一些情境下需要绑定的不是一般的数据,而是html.那么ng-bind就不够用了,需要使用ng-bind-html,它会将内容作为html格式输出.比如想输出带有class的html,那么就使用ng-bind-html,而且还需要ngSanitize的配合,需要引入相应的文件.
(8) 获取ng-repeat数据filter后的结果
&&&&这个一般在搜索的时候需要用到,比如多重ng-repeat数据形成列表.然后filter一个字段,现在要得到filter之后的结果,有2中方式.
&&&&一种是在html的ng-repeat中类似这么写:
ng-repeat=
"food&in&foodCategory._displayfoods&=&(foodCategory.foods&|&filter:&{&'name':&searchobj.foodfilter&}&|&orderBy:&food.sort_order)"
&&&&这样_displayfoods就是filter后的最终显示的结果.另一种方式是通过两套数据,一套写在controller中,然后filter以及orderBy都是在controller中操作,最后操作的结果在用来ng-repeat.
&&&&第一种方式比较方便,第二种方式更好,性能也好.
(9) ng-class以及ng-style通过判断赋值
&&&&根据变量的值决定是否应用某种class,以及不同的style样式.
&&&&ng-class=”{‘state-error’:!foodForm.foodstock.$valid}”
&&&&ng-style=”{ color: i.color==” || i.name==’活’ ? ‘default’ : ‘#fff’ }”
(10) form校验以input为例
&&&&angular的form可以通过input的HTML5属性进行校验,这里主要通过form以及input的name属性进行锁定,formname.inputname.$valid表示name为inputname的空间是否通过本身的属性校验.
(11) $resource和$http的$promise
resource.query().$promise,
resource2.query().$promise
]).then(functon(success){
console.log(success);
},functon(error){
console.log(error);
foodFactory.food.save(f).$promise.then(
foodFactory.food.get({id:result.id}).$promise.then(
&&&&这个不解释了,直接看就可以了,注意$http的promise需要手动返回,所以一般情况下都通过$resource.
(12) 仅$watch监听collection中的一个属性
&&&&$watch的第三个参数设置为true,即可deep watch.不过有时候其实不想或者不需要监听collection的全部属性.只要监视其中的一个或者几个,这时候通过for循环虽然可以循环$watch不过明显太挫.
&&&&通过下面这种写法就可以监控一个collection的单独一个object属性.
$scope.people&=&[
"groupname"
"persions"
"groupname"
"persions"
$scope.$watch(
($scope)&{
$scope.people.map(
obj.persions.map(
(newVal)&{
$scope.count++;
$scope.msg&=&
'person&name&was&changed'
(13)&debounce防抖处理
&&&&这个对于频繁出发的处理非常有用,适用于类似ng-change,$watch的一些场景.比如根绝关键字即时搜索的场合,将$debounce封装为服务,直接调用接口,代码:
(14) 快速定位到某个位置
&&&&一般来讲页面内通过这样的形式就可以结合js代码,实现快速定位.在angular中也是通过类似的原理实现,代码如下:
old&=&$location.hash();
$location.hash(
'batchmenu-bottom'
$anchorScroll();
$location.hash(old);
&&&&这样写是因为直接location.hash会导致url变化,页面跳转,所以加了防止跳转的代码.
&&&&暂时就总结了这么多,很多东西都是查资料以及自己实践的,希望对需要的TX会有所帮助,以后如果有新的东西会续写一下.
& * 导出我的健康报告表格
&public function actionHealthexcel($id)
& // $this-&layout = ‘table2excel’;
& $model = HealthReport::model()-&findByPk($id);
& $items = $model-&getItems();
& // var_dump($items);
& if($model-&type_code==1){
& &$data = array(
& & array(‘a’=&’
‘,’b'=&’原始分
‘,’c'=&’相当年龄’,'d’=&’百分位
‘, ‘e’=&’标准分’),
& & array(‘a’=&’姿势
‘,’b'=&$items[1] ,’c'=&$items[2] ,’d'=&$items[3] , ‘e’=&$items[4]),
& & array(‘a’=&’移动
‘,’b'=&$items[5] ,’c'=&$items[6] ,’d'=&$items[7] , ‘e’=&$items[8]),
& & array(‘a’=&’实物操作
‘,’b'=&$items[9] ,’c'=&$items[10],’d'=&$items[11], ‘e’=&$items[12]),
& & array(‘a’=&’抓握
‘,’b'=&$items[13],’c'=&$items[14],’d'=&$items[15], ‘e’=&$items[16]),
& & array(‘a’=&’视觉运动整合’,'b’=&$items[17],’c'=&$items[18],’d'=&$items[19], ‘e’=&$items[20]),
& & array(‘a’=&’
‘,’b'=&’GMQ
‘,’c'=&’FMQ
‘,’d'=&’TMQ
‘, ‘e’=&”),
& & array(‘a’=&’标准分和
‘,’b'=&$items[21],’c'=&$items[22],’d'=&$items[23], ‘e’=&”),
& & array(‘a’=&’发育商
‘,’b'=&$items[24],’c'=&$items[25],’d'=&$items[26], ‘e’=&”),
& & array(‘a’=&’评价
‘,’b'=&$items[27],’c'=&$items[28],’d'=&$items[29], ‘e’=&”),
& & array(‘a’=&’百分位
‘,’b'=&$items[30],’c'=&$items[31],’d'=&$items[32], ‘e’=&”),
& & array(‘a’=&’评价
‘,’b'=&$model-&evaluate,’c'=&”,’d'=&”, ‘e’=&”),
& }elseif($model-&type_code==2){
& &$data = array(
& & array(‘a’=&’类别
‘,’b'=&’项目
‘,’c'=&’测试
‘,’d'=&’评价
& & array(‘a’=&’体型测试’,'b’=&’遗传类型
‘,’c'=&’
‘,’d'=&$items[1] ),
& & array(‘a’=&’生长发育’,'b’=&’体脂含量
‘,’c'=&$items[2] ,’d'=&$items[3] ),
& & array(‘a’=&’
‘,’b'=&’身高体重比’,'c’=&$items[4] ,’d'=&$items[5] ),
& & array(‘a’=&’生理功能’,'b’=&’安静时肪搏’,'c’=&$items[6] ,’d'=&$items[7] ),
& & array(‘a’=&’
‘,’b'=&’肺活量
‘,’c'=&$items[8] ,’d'=&$items[9] ),
& & array(‘a’=&’身体素质’,'b’=&’握力
‘,’c'=&$items[10],’d'=&$items[11]),
& & array(‘a’=&’
‘,’b'=&’立定跳远
‘,’c'=&$items[12],’d'=&$items[13]),
& & array(‘a’=&’
‘,’b'=&’仰卧起坐
‘,’c'=&$items[14],’d'=&$items[15]),
& & array(‘a’=&’
‘,’b'=&’坐位体前屈’,'c’=&$items[16],’d'=&$items[17]),
& & array(‘a’=&’
‘,’b'=&’反复侧跨
‘,’c'=&$items[18],’d'=&$items[19]),
& & array(‘a’=&’
‘,’b'=&’跳绳
‘,’c'=&$items[20],’d'=&$items[21]),
& & array(‘a’=&’评价
‘,’b'=&$model-&evaluate,’c'=&”,’d'=&”),
& $dataProvider = new CArrayDataProvider($data, array(
& &’pagination’ =& false,
& &’keyField’ =& false,
& $widget = $this-&widget(‘EExcelView’, array(
& &’dataProvider’=& $dataProvider,
& &’title’=&$model-&childer_name,
& &’autoWidth’=&false,
& &’exportType’=&’Excel;,
& &’filename’=&$model-&childer_name.date(‘Y-m-d’, strtotime($model-&create_time)),
& &’disablePaging’=&true,
& &’stream’=&true,
& &’grid_mode’=&’export’, //export|grid
& &// ‘columns’=&array(
array(‘header’=&’类别’, ‘name’=&’a'),
array(‘header’=&’项目’, ‘name’=&’b'),
array(‘header’=&’测试’, ‘name’=&’c'),
array(‘header’=&’评价’, ‘name’=&’d'),
The ngOptions directive in AngularJS allows you to build and bind an HTML select element with options to a model property. It’s quite a versatile directive and is smarter than trying to build the select options with ngRepeat since ngOptions is optimized for two way data binding.
There are some tricks, however.
Let’s start with the following simple controller in JavaScript.
varEngineeringController = function($scope) {
$scope.engineer = {
name:"Dani",
currentActivity:"Fixing bugs"
$scope.activities =
"Writing code",
"Testing code",
"Fixing bugs",
The goal is to build a drop down list to select an engineer’s current activity.
divdata-ng-controller="EngineeringController"&
{{engineer.name}} is currently: {{ engineer.currentActivity}}
Choose a new activity:
selectdata-ng-model="engineer.currentActivity"
data-ng-options="act for act in activities"&
One of the tricks to using ngOptions is figuring out the expression AngularJS expects. The current value of “act for act in activities” is telling AngularJS to use the value of each entry in the activities array. This syntax against a simple array of strings allows the select element to appear with the engineer’s current activity selected, and if the selected option changes the framework updates the engineer’s current activity (and vice versa).
The expression you can use with ngOptions can be quite a bit more advanced (which could be good or bad). For example, instead of using strings let’s use objects to represent an activity.
varEngineeringController = function($scope) {
$scope.engineer = {
name:"Dani",
currentActivity: {
type:"Work",
name:"Fixing bugs"
$scope.activities =
{ id: 1, type: "Work", name: "Writing code"},
{ id: 2, type: "Work", name: "Testing code"},
{ id: 3, type: "Work", name: "Fixing bugs"},
{ id: 4, type: "Play", name: "Dancing"}
And we’ll change the ngOptions expression to build a label for the select option.
selectdata-ng-model="engineer.currentActivity"
data-ng-options="a.name +' (' + a.type + ')' for a in activities"&
This produces:
Expressions can also create optgroup elements when using a group by in the expression.
selectng-model="engineer.currentActivity"
data-ng-options="a.name group by a.type for a in activities"&
Which yields:
What About The Initial Selection?
When we switched from an array of strings to activities as objects, we lost the ability for the select to show the starting currentActivity as initially selected. If the user selects a new activity the two-way data binding works and the currentActivity is set, but we lost the initial selection. This is because AngularJS is doing reference comparisons and employee.currentActivity might by “Fixing bugs”, but employee.currentActivity != activities[2], so the page starts with an empty selection in the drop down list.
This is a common occurrence since the engineer object and the activities list are most likely de-serialized from HTTP calls and will completely different object graphs.
There is no good solution with the exiting ngOptions directive but to “fix up” the engineer once the engineer and all the possible activities are loaded. Something like the following (which could be shortened with a library like undercore.js).
for(vari = 0; i
if($scope.activities[i].id == $scope.engineer.currentActivity.id) {
$scope.engineer.currentActivity = $scope.activities[i];
One Last Variation
What if you had objects representing activities but only wanted the Id property of the selected activity instead of the entire activity. The ngOptions expression can handle this scenario, too. Inside the controller would look like this:
$scope.engineer = {
name:"Dani",
currentActivityId: 3
$scope.activities =
{ id: 1, type: "Work", name: "Writing code"},
{ id: 2, type: "Work", name: "Testing code"},
{ id: 3, type: "Work", name: "Fixing bugs"},
{ id: 4, type: "Play", name: "Dancing"}
And the expression would use a select as value syntax.
selectng-model="engineer.currentActivityId"
data-ng-options="a.id as a.name group by a.type for a in activities"&
And that concludes this post on ngOptions. I hope you found the topic stimulating, and stayed on the edge of your seat until these final words.
encodeURIComponent
AngularJS指令进阶 – ngModelController详解
在自定义Angular指令时,其中有一个叫做require的字段,这个字段的作用是用于指令之间的相互交流。举个简单的例子,假如我们现在需要编写两个指令,在linking函数中有很多重合的方法,为了避免重复自己(著名的DRY原则),我们可以将这个重复的方法写在第三个指令的controller中,然后在另外两个需要的指令中require这个拥有controller字段的指令,最后通过linking函数的第四个参数就可以引用这些重合的方法。代码的结构大致如下:
var app = angular.modeule('myapp',[]);app.directive('common',function(){return{...
controller:function($scope){
this.method1 =function(){};
this.method2 =function(){};},...}});app.directive('d1',function(){return{...
require:'?^common',
link:function(scope,elem,attrs,common){
scope.method1 = common.method1;..},...}});app.directive('d2',function(){return{...
require:'?^common',
link:function(scope,elem,attrs,common){
scope.method1 = common.method1;..},...}});
当然,上面例子只是指令中controller用法的一种。虽然一般来说,使用controller字段的机会不是很多,但是想要写好AngularJS的指令,这是必须要掌握的一点。
显然,controller的用法分为两种情形,一种是require自定义的controller,由于自定义controller中的属性方法都由自己编写,使用起来比较简单;另一种方法则是require AngularJS内建的指令,其中大部分时间需要require的都是ngModel这个指令。很多时候,由于我们对ngModel中内建的方法和属性不熟悉,在阅读和编写代码时会有一些困难。今天我们的目的就是详细的介绍ngModel中的内建属性和方法,相信在认真的阅读完本文之后,你一定能够熟练的在指令中require ngModel。
在Angular应用中,ng-model指令时不可缺少的一个部分,它用来将视图绑定到数据,是双向绑定魔法中重要的一环。ngModelController则是ng-model指令中所定义的controller。这个controller包含了一些用于数据绑定,验证,CSS更新,以及数值格式化和解析的服务。它不用来进行DOM渲染或者监听DOM事件。与DOM相关的逻辑都应该包含在其他的指令中,然后让这些指令来试用ngModelController中的数据绑定功能。
下面,我们将用一个例子来说明如何在自定义指令中require ngModel。在这里例子中,我们使用HTML5中的contenteditable属性来制作了一个简单的编辑器指令,同时将在指令定义中require了ngModel来进行数据绑定。
form name="myForm"&div contenteditable
name="myWidget" ng-model="userContent"
strip-br="true"
required&Change me!/div&span ng-show="myForm.myWidget.$error.required"&Required!/span&hr&textarea ng-model="userContent"&/textarea&/form&
指令定义部分
angular.module(‘customControl’, []).
directive(‘contenteditable’, function() {
restrict: ‘A’, // 作为元素属性
require: ‘?ngModel’, // 获取ngModelController
link: function(scope, element, attrs, ngModel) {
if(!ngModel) // 如果没有ng-model则什么都不做
// 指定UI的更新方式
ngModel.$render =function(){
element.html(ngModel.$viewValue ||'');}; // 监听change事件来开启绑定
element.on('blur keyup change',function(){
scope.$apply(read);});read(); // 初始化 // 将数据写入modelfunctionread(){var html = element.html(); // 当我们清空div时浏览器会留下一个标签 // 如果制定了strip-br属性,那么标签会被清空if( attrs.stripBr && html ==''){
html ='';}
ngModel.$setViewValue(html);}}};
ngModelController方法
当视图需要更新的时候会被调用。使用ng-model的指令应该自行实现这个方法。
该方法用于判断输入值是否为空。
例如,使用ngModelController的指令需要判断其中是否有输入值的时候会使用该方法。该方法可用来判断值是否为undefined,”,null或者NaN。
你可以根据自己的需要重载该方法。
该方法用于改变验证状态,以及在控制变化的验证标准时通知表格。
这个方法应该由一个验证器来调用。例如,一个解析器或者格式化函数。
该方法用于设置控制到原始状态。
该方法可以移除’ng-dirty’类并将控制恢复到原始状态(‘ng-pristine’类)。
该方法用于取消一次更新并重置输入元素的值以防止$viewCalue发生更新,它会由一个pending debounced事件引发或者是因为input输入框要等待一些未来的事件。
如果你有一个使用了ng-model-options指令的输入框,并为它设置了debounced事件或者是类似于blur的事件,那么你可能会碰到在某一段时间内输入框中值和ngModel的$viewValue属性没有保持同步的情况。
在这种情况下,如果你试着在debounced/future事件发生之前更新ngModel的$modelValue,你很有可能遇到困难,因为AngularJS的dirty cheching机制实际上并不会分辨一个模型究竟有没有发生变化。
$cancelUpdate()方法应该在改变一个输入框的model之前被调用。记住,这很重要因为这能够确保输入字段能够被新的model值更新,而pending操作将会被取消。下面是一个例子:
form name="myForm" ng-model-options="{ updateOn: 'blur' }"&p&With $cancelUpdate()/p&input name="myInput1" ng-model="myValue" ng-keydown="resetWithCancel($event)"&br/&myValue:"{{ myValue }}"p&Without $cancelUpdate()/p&input name="myInput2" ng-model="myValue" ng-keydown="resetWithoutCancel($event)"&br/&myValue:"{{ myValue }}"/form&/div&
angular.module('cancel-update-example',[]).controller('CancelUpdateCtrl',function($scope){
$scope.resetWithCancel =function(e){if(e.keyCode ==27){
$scope.myForm.myInput1.$cancelUpdate();
$scope.myValue ='';}};
$scope.resetWithoutCancel =function(e){if(e.keyCode ==27){
$scope.myValue ='';}};});
ngModelController中的属性
只要视图的值发生变化,其中的函数就会被执行。其中的函数执行并不带参数,它的返回值也会被忽略。它可以被用在额外的#watches中。
一个包含所有error的对象
如果用户还没有进行过交互,值是true。
如果用户已经进行过交互,值是true。
如果没有错误,值是true。
如果有错误,值是true。
本文参考自AngularJS文档,原文地址
如果你觉得本文对你有帮助,请为我提供赞助
ES6带来了许多好东西,它们能够是我们开发出更快更好的web应用。现在我们就来看看其中几个最有用的几个。
在ES6中存在多个可以缩短开发时间并加快应用运行速度的语法糖:
这个特性非常有趣。例如,你可以吧一个对象结构为分开的变量:
var point ={x:1,y:2};var[x,y]= point;console.log(x); //1console.log(y); //2
解构的另一个用途是在一个函数中返回不同的值 – 不在需要返回一个对象了。我们可以根据我们的需要省略一些返回值。看下面的代码:
functionreturnsFewValues(){return{
它与下面的代码等价:
functionreturnsFewValues(){return[1,2];}
Let和Const
这两个关键字非常有用。它们都允许我们在一个作用域中锁定一个变量,因此在作用域意外它无法被获取:let用于普通变量,const用于常量 – 即值永远不会改变的变量。我们现在可以忘记使用丑陋的闭包了:
functionx(){(function(){var a =2;
a = a +2;}());}console.log(a); //undefined
上面的代码可以被更加优雅的let语句所替代:
functionx(){let a =2;
a = a +2;}
console.log(a); //undefined
For-Of以及数组理解
for-of是旧的for-in表述的小弟弟。使用它,我们可以迭代值,而不迭代键:
var someArray =["a","b","c"];for(v of someArray){
console.log(v);}
它也可以用在数组理解中。它们都是受到了数学中集合标示符的启发。例如,如果你有一个包含名字的数组,你只想要抓取其中长度在八个或以上的名字。在ES6之前,你可能会这样做:
var eightLetterLongNames =[];someNamesArray.forEach(function(name){if(name.length &=8) eightLetterLongNames.push(name);});
但是在ES6中,我们有更简单的写法:
var eightLetterLongNames =[x for(name of someNamesArray)if(name.length)&=8];
你只需要从一个函数中返回一个值或者打印一些东西?通常,我们会这样做:
element.addEventListener('click',function(e){console.log(e);});
ES6中的一个语法糖是箭头函数,它可以定义更好的一行函数:
element.addEventListener('click',(e)=& console.log(e));
延伸操作符,剩余变量,以及默认参数
现在来看最后一个。我们现在终于可以定义默认参数并且忘记老旧的argument = argument || “default value”咒语了。像下面的代码一样定义函数:
function(arg1 ="default value", arg2 =false, arg3){ //函数体}
延伸操作符允许我们将一个数组想分开的参数那样传递给一个函数。原来的写法:
var someArray =["a","b","c"];console.log.apply(window,someArray);
你现在可以这样写:
var someArray =["a","b","c"];console.log(...someArray);
如果你想要你的函数接收几个命名的变量以及后面几个无数目限制的变量,那么剩余变量将是一个很好的解决方案:
functionlogWithTag(tag){var logs =[].slice.call(arguments,1);
logs.forEach(function(log){
console.log(tag +': '+ log);});}
上面的代码是以前的写法,现在可以像下面这样写,而且更有可读性:
functionlogWithTag(tag,...logs){
logs.forEach(function(log){
console.log(tag +': '+ log);});}
或者配合箭头函数可以更简单:
var logWithTag =(tag,...logs)=& logs.forEach((log)=& console.log(tag +': '+ log));
最终,ES变成了一个真正的面向对象语言。由于类的引入,我们可以编写更加干净结构更加清晰的代码。我们现在不再需要使用一些流行的库来解决JavaScript中不包含类的问题了:
var SimpleClass =newExt.Class({
name:'John Doe',
initialize:function(name){
this.name = name;},
say:function(message){return this.name +": "+ message;}});//PrototypeJS
var Person = Class.create();Person.prototype ={
name:'John Doe',
initialize:function(name){
this.name = name;},
say:function(message){return this.name +': '+ message;}};
现在我们可以用纯JavaScript来代替上面的代码:
class Person{
public name:'John Doe'initialize(name){
this.name = name;}say(message){return this.name +': '+ message;}};
ES6同样支持继承和扩展类,因此你完全可以使用JavaScript来编写像JAVA一样的面向对象应用。使用这种方式,你的带按摩变得更阿基简介并更容易阅读。
ES6中另一个令人激动的特性是模块。现在,已经有很多解决方法来模块化你的应用,主要是CommonJS和AMD。下面是几个例子:
//CommonJS
//point.js
functionPoint(x,y){
this.x = x;
this.y = y;}module.exports = Point;//myapp.js
var Point =require("point");var origin =newPoint(0,0);console.log(origin);//AMD
//point.js
define("point",function(){functionPoint(x,y){
this.x = x;
this.y = y;}return Point;});//myapp.js
define("my app",["point"],function(point){var origin =newPoint(0,0);
console.log(origin);});
在ES6中你不再需要这些库,你需要做的只是把你的代码分成小块。使用类,你可以获得更简洁更具有可维护性的代码:
//point.js
module "point"{
export class Point{
constructor (x,y){
public x = x;
public y = y;}}}//myapp.js
module point from "/point.js"import Point from "point"var origin =newPoint(0,0);console.log(origin);
映射和集合
映射和集合在JavaScript中缺失已经很久了。它们都通过使用对象来模拟,但是当你想要迭代它们时会产生很多麻烦 – 你需要检查属性是否存在原型中,以及属性是否是一个方法:
var map ={
c:3};for(var k in map){if(map.hasOwnProperty(k)){
console.log(map[k]);}}for(var k in map){if(map.hasOwnProperty(k)){
console.log(k);}}
ES6中有更简单的方法:
var map =newMap;map.set("a",1);map.set("b",2);map.set("c",3);for(var v in map.values()){
console.log(v);}for(var k in map.keys()){
console.log(k);}
对于集合,它们和数组类似,但是值是有序的而且不能重复。下面是一个创建一个集合的例子:
var set =newSet;set.add(1);set.add(2);set.add(3);for(var v in set.values()){
console.log(v);}
迭代器是特殊的函数,它能帮助我们在一个自定义对象中进行迭代。它们也被称为发生器,因为当它们单独使用时,它们可以生成内容(例如斐波那契数列或者随机数)。前面提到的values()和keys()是图的迭代器。基本上来说,你可以像定义一个函数一样定义一个迭代器,但是在函数名和function关键字之间有一个*号:
function*fibonacci(){let[ current, next ]=[0,1];for(;;){//无限循环[ current, next ]=[ next, current + next ];
yield current;}}
使用这种方法,作用域被挂起,并且你可以通过在返回值上调用next()来得到下一个值或者迭代它:
var fib =fibonacci();console.log(fib.next()); //1console.log(fib.next()); //2for(var v of lib){if(v &100)break;
console.log(v); //3,5,8...}
内存泄露一直是一个大问题,尤其是在一个web应用中。一个一般的资源是集合(collections),它的键不是字符串或者数字(例如,你可以将对象作为键)。通常使用两个数组来实现 – 一个作为键一个作为值。这种方法很糟糕,因为作为键的数组并不能被垃圾回收因此内存泄露往往就在这里发生了。
若映射的优势在于它能够弱引用键对象,这意味着它不会阻止垃圾回收器回收不再被引用的键对象。看看下面的例子:
var key1 = window, key2 = document;var map =newWeakMap(), map2 =newWeakMap();map.set(key1,"some value");map.set(key2, key1);map.set(map2, map); //你甚至可以进行环形引用
数据绑定在任何DOM造作库中都是非常有用的特性。现在,通过使用Proxies,它的语法和性能都将得到提升。同时,Proxies可以用来拦截对象中的改变并将改变打印出来,如果你需要的话。最大的改变在于你在被监控的对象上不再需要任何get()和set()函数了,因此你可以在以后的代码中移除日志功能而不需要改变任何代码。下面是一个日志代理的例子:
var logger =function(obj, info){return Proxy.create({
get:functionget(receiver, prop){info('Getting '+ prop);return obj[prop];},
set:functionset(receiver, prop, value){info('Setting '+ prop +' to '+ value +'; was '+ obj[prop]);
obj[prop]= value;}});};var object ={ a:'some value', b:22};// 当你不需要日志的时候这里可以移除object =logger(object,functioninfo(msg){
console.log(msg);});document.write(obejct.a);object.a ='new value';document.write(object.a);
模板字符串
许多人都很怀念JavaScript中的模板字符串。它们不仅允许我们轻松的在代码中插入变量,而且可以防止各种攻击来保证安全输出。模板字符串使用‘来定义。在其中,你可以使用一个$符号以及花括号来插入可执行的代码或者变量:
var name ="John", surname ="Doe";var template1 = `Hello! My name id ${name} ${surname}!`;console.log(template); //Hello! My name is John Doe var a =1, b =2, c =3;var template = `${a}+ ${b}- ${c}/2= $ { a + b - c /2}`;
console.log(template2); // 1 + 2 - 3 / 2 = 1.5
你也可以在模板字符串前面定义一个标签。标签是一个函数,它将解析模板字符串中的部分,因此你可以处理一些用户生成的内容。ES6中已经有一些默认的标签了。最有用的一个,我认为是safehtml标签。简单来说,它能探测出一些不安全的内容例如XSS攻击等等,并将它们转化为无害的值。下面是一个例子:
var template = safehtml`a href="${someUserdefinedVariable}"&Click me!/a&`;
本文译自Eight Cool Features Coming in ES6,原文地址如果你觉得本文对你有帮助,请点击下面的链接为我提供赞助新年快乐!

我要回帖

更多关于 we say是什么意思 的文章

 

随机推荐