改善用户体验的 3 个 AngularJS 指令 【已翻译100%】

AngularJS指令可以为给你的访问者提供更好的用户体验,比如通过展示用户头像来使页面看起来更具个性化。在你的注册表单中,可以在电子邮箱地址一栏的旁边展示一个头像,指示用户输入的是否是一个正确的邮件地址。如果在你的表单中有可选输入项,你可以默认隐藏它们,当用户点击时再展示出来,并且立刻自动将焦点对准第一个输入框。这些方法非常容易实现,并且可以通过指令来获得复用。

你有许多方式来构建AngularJS指令。关于如果创建用户指令已经有非常多的教程和指导(所以我不打算在此描述一些基本的东西):

  • AngularJS:开发者指南
  • Sidepoint:实用指南
  • ...

我这里选取了三条对于提升用户体验非常有帮助的指令,并且我很早就将其应用在产品中。

1.头像图片

为了在你的应用中展示头像图片,你需要使用用户的电子邮件地址,将地址转换为小写并使用md5加密该字符串。所以聪明的做法是使用指令来做到这些,并且可以复用。

/*
 * A simple Gravatar Directive
 * @example
 *   <gravatar-image email="test@email.com" size="50"></gravatar-image>
 */
app.directive('gravatarImage', function () {
  return {
    restrict: 'AE',
    replace: true,
    required: 'email',
    template: '<img ng-src="https://www.gravatar.com/avatar/{{hash}}?s={{size}}&d=identicon" />',
    link: function (scope, element, attrs) {
      attrs.$observe('email', function (value) {
        if(!value) { return; }

        // MD5 (Message-Digest Algorithm) by WebToolkit
        var md5=function(s){function L(k,d){return(k<<d)|(k>>>(32-d));}function K(G,k){var I,d,F,H,x;F=(G&2147483648);H=(k&2147483648);I=(G&1073741824);d=(k&1073741824);x=(G&1073741823)+(k&1073741823);if(I&d){return(x^2147483648^F^H);}if(I|d){if(x&1073741824){return(x^3221225472^F^H);}else{return(x^1073741824^F^H);}}else{return(x^F^H);}}function r(d,F,k){return(d&F)|((~d)&k);}function q(d,F,k){return(d&k)|(F&(~k));}function p(d,F,k){return(d^F^k);}function n(d,F,k){return(F^(d|(~k)));}function u(G,F,aa,Z,k,H,I){G=K(G,K(K(r(F,aa,Z),k),I));return K(L(G,H),F);}function f(G,F,aa,Z,k,H,I){G=K(G,K(K(q(F,aa,Z),k),I));return K(L(G,H),F);}function D(G,F,aa,Z,k,H,I){G=K(G,K(K(p(F,aa,Z),k),I));return K(L(G,H),F);}function t(G,F,aa,Z,k,H,I){G=K(G,K(K(n(F,aa,Z),k),I));return K(L(G,H),F);}function e(G){var Z;var F=G.length;var x=F+8;var k=(x-(x%64))/64;var I=(k+1)*16;var aa=Array(I-1);var d=0;var H=0;while(H<F){Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=(aa[Z]|(G.charCodeAt(H)<<d));H++;}Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=aa[Z]|(128<<d);aa[I-2]=F<<3;aa[I-1]=F>>>29;return aa;}function B(x){var k="",F="",G,d;for(d=0;d<=3;d++){G=(x>>>(d*8))&255;F="0"+G.toString(16);k=k+F.substr(F.length-2,2);}return k;}function J(k){k=k.replace(/rn/g,"n");var d="";for(var F=0;F<k.length;F++){var x=k.charCodeAt(F);if(x<128){d+=String.fromCharCode(x);}else{if((x>127)&&(x<2048)){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128);}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128);}}}return d;}var C=Array();var P,h,E,v,g,Y,X,W,V;var S=7,Q=12,N=17,M=22;var A=5,z=9,y=14,w=20;var o=4,m=11,l=16,j=23;var U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;P<C.length;P+=16){h=Y;E=X;v=W;g=V;Y=u(Y,X,W,V,C[P+0],S,3614090360);V=u(V,Y,X,W,C[P+1],Q,3905402710);W=u(W,V,Y,X,C[P+2],N,606105819);X=u(X,W,V,Y,C[P+3],M,3250441966);Y=u(Y,X,W,V,C[P+4],S,4118548399);V=u(V,Y,X,W,C[P+5],Q,1200080426);W=u(W,V,Y,X,C[P+6],N,2821735955);X=u(X,W,V,Y,C[P+7],M,4249261313);Y=u(Y,X,W,V,C[P+8],S,1770035416);V=u(V,Y,X,W,C[P+9],Q,2336552879);W=u(W,V,Y,X,C[P+10],N,4294925233);X=u(X,W,V,Y,C[P+11],M,2304563134);Y=u(Y,X,W,V,C[P+12],S,1804603682);V=u(V,Y,X,W,C[P+13],Q,4254626195);W=u(W,V,Y,X,C[P+14],N,2792965006);X=u(X,W,V,Y,C[P+15],M,1236535329);Y=f(Y,X,W,V,C[P+1],A,4129170786);V=f(V,Y,X,W,C[P+6],z,3225465664);W=f(W,V,Y,X,C[P+11],y,643717713);X=f(X,W,V,Y,C[P+0],w,3921069994);Y=f(Y,X,W,V,C[P+5],A,3593408605);V=f(V,Y,X,W,C[P+10],z,38016083);W=f(W,V,Y,X,C[P+15],y,3634488961);X=f(X,W,V,Y,C[P+4],w,3889429448);Y=f(Y,X,W,V,C[P+9],A,568446438);V=f(V,Y,X,W,C[P+14],z,3275163606);W=f(W,V,Y,X,C[P+3],y,4107603335);X=f(X,W,V,Y,C[P+8],w,1163531501);Y=f(Y,X,W,V,C[P+13],A,2850285829);V=f(V,Y,X,W,C[P+2],z,4243563512);W=f(W,V,Y,X,C[P+7],y,1735328473);X=f(X,W,V,Y,C[P+12],w,2368359562);Y=D(Y,X,W,V,C[P+5],o,4294588738);V=D(V,Y,X,W,C[P+8],m,2272392833);W=D(W,V,Y,X,C[P+11],l,1839030562);X=D(X,W,V,Y,C[P+14],j,4259657740);Y=D(Y,X,W,V,C[P+1],o,2763975236);V=D(V,Y,X,W,C[P+4],m,1272893353);W=D(W,V,Y,X,C[P+7],l,4139469664);X=D(X,W,V,Y,C[P+10],j,3200236656);Y=D(Y,X,W,V,C[P+13],o,681279174);V=D(V,Y,X,W,C[P+0],m,3936430074);W=D(W,V,Y,X,C[P+3],l,3572445317);X=D(X,W,V,Y,C[P+6],j,76029189);Y=D(Y,X,W,V,C[P+9],o,3654602809);V=D(V,Y,X,W,C[P+12],m,3873151461);W=D(W,V,Y,X,C[P+15],l,530742520);X=D(X,W,V,Y,C[P+2],j,3299628645);Y=t(Y,X,W,V,C[P+0],U,4096336452);V=t(V,Y,X,W,C[P+7],T,1126891415);W=t(W,V,Y,X,C[P+14],R,2878612391);X=t(X,W,V,Y,C[P+5],O,4237533241);Y=t(Y,X,W,V,C[P+12],U,1700485571);V=t(V,Y,X,W,C[P+3],T,2399980690);W=t(W,V,Y,X,C[P+10],R,4293915773);X=t(X,W,V,Y,C[P+1],O,2240044497);Y=t(Y,X,W,V,C[P+8],U,1873313359);V=t(V,Y,X,W,C[P+15],T,4264355552);W=t(W,V,Y,X,C[P+6],R,2734768916);X=t(X,W,V,Y,C[P+13],O,1309151649);Y=t(Y,X,W,V,C[P+4],U,4149444226);V=t(V,Y,X,W,C[P+11],T,3174756917);W=t(W,V,Y,X,C[P+2],R,718787259);X=t(X,W,V,Y,C[P+9],O,3951481745);Y=K(Y,h);X=K(X,E);W=K(W,v);V=K(V,g);}var i=B(Y)+B(X)+B(W)+B(V);return i.toLowerCase();};

        scope.hash = md5(value.toLowerCase());
        scope.size = attrs.size;

        if(angular.isUndefined(scope.size)) {
          scope.size = 60; // default to 60 pixels
        }
      });
    }
  };
});
  1. Focus-Me
It is really just a small directive, but it’s awesome. In the example below the user clicks on a link, where he makes an input visible, which gets automatically focused. So he doesn’t need to click in the input field when it shows up.
/**
 * Sets focus to this element if the value of focus-me is true.
 * @example
 *  <a ng-click="addName=true">add name</a>
 *  <input ng-show="addName" type="text" ng-model="name" focus-me="{{addName}}" />
 */
app.directive('focusMe', ['$timeout', function($timeout) {
  return {
    scope: { trigger: '@focusMe' },
    link: function(scope, element) {
      scope.$watch('trigger', function(value) {
        if(value === "true") {
          $timeout(function() {
            element[0].focus();
          });
        }
      });
    }
  };
}]);
  1. 关注我

这其实是一个非常简短的指令,但是非常棒。在下面的例子中,用户点击了一个链接,显示的输入框需要能够自动获得焦点。这样,用户在页面显示时不必再手动点击文本域。

/**
 * Sets focus to this element if the value of focus-me is true.
 * @example
 *  <a ng-click="addName=true">add name</a>
 *  <input ng-show="addName" type="text" ng-model="name" focus-me="{{addName}}" />
 */
app.directive('focusMe', ['$timeout', function($timeout) {
  return {
    scope: { trigger: '@focusMe' },
    link: function(scope, element) {
      scope.$watch('trigger', function(value) {
        if(value === "true") {
          $timeout(function() {
            element[0].focus();
          });
        }
      });
    }
  };
}]);

3.Contenteditable元素模型绑定

我们使用contenteditable而不是textarea元素的最主要原因在于使用前者可以在布局和UI中没有限制。我们在编辑器中使用这条指令可以实现将contenteditable元素的html和ng-model进行一个双向绑定。目前,在contenteditable元素中并没有支持ng-model。

/**
 * Two-way data binding for contenteditable elements with ng-model.
 * @example
 *   <p contenteditable="true" ng-model="text"></p>
 */
app.directive('contenteditable', function() {
  return {
    require: '?ngModel',
    link: function(scope, element, attrs, ctrl) {

      // Do nothing if this is not bound to a model
      if (!ctrl) { return; }

      // Checks for updates (input or pressing ENTER)
      // view -> model
      element.bind('input enterKey', function() {
        var rerender = false;
        var html = element.html();

        if (attrs.noLineBreaks) {
          html = html.replace(/<div>/g, '').replace(/<br>/g, '').replace(/<\/div>/g, '');
          rerender = true;
        }

        scope.$apply(function() {
          ctrl.$setViewValue(html);
          if(rerender) {
            ctrl.$render();
          }
        });
      });

      element.keyup(function(e){
        if(e.keyCode === 13){
          element.trigger('enterKey');
        }
      });

      // model -> view
      ctrl.$render = function() {
        element.html(ctrl.$viewValue);
      };

      // load init value from DOM
      ctrl.$render();
    }
  };
});

结论:AngularJS指令可用于改善用户体验

我希望经过文中的介绍,你会感悟到AngularJS指令的有用之处。

对我而言,指令是AngularJS中最激动人心的特性。创建可重用的组件,并可以将其添加到纯粹的HTML应用程序库,这是多么难以置信并且强大的功能。由于指令实用,并且大部分指令书写难度不高,许多开发者早已对于目前受欢迎的库开发了许多指令。举例来说,AngularJS团队已经为Bootstrap创建了一系列的指令(难道还有人不用它吗?),被称作UI Bootstrap。

时间: 2024-09-27 03:28:25

改善用户体验的 3 个 AngularJS 指令 【已翻译100%】的相关文章

3个可以改善用户体验的AngularJS指令介绍

  这篇文章主要介绍了3个可以改善用户体验的AngularJS指令,AngularJS是一款具有很高人气的JavaScript框架,需要的朋友可以参考下 1.头像图片 为了在你的应用中展示头像图片,你需要使用用户的电子邮件地址,将地址转换为小写并使用md5加密该字符串.所以聪明的做法是使用指令来做到这些,并且可以复用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29   /* * A

后台产品交互设计:了解用户目标改善用户体验

文章描述:更贴近业务及用户--交互设计工作方式转变感言. 引子: 年初时交互设计师与产品经理座谈,议题关于交互设计师应从哪个工作环节切入更能发挥其自身价值.结论是交互随产品经理参与到项目初期需求挖掘阶段,更早的参与了解业务需求及用户需求,与产品经理共同产出PRD(带有用户体验的高保真原型部分由交互设计师着力产出,原型好处:方便用户参与可用性测试.整个产品团队更直观地把握设计要求,优势是显而易见的).取而代之目前项目正式启动,产品经理产出详细的PRD后,交互设计师再参与到项目里参与原型设计,有点迟

为了改善用户体验,知乎应该重新审视

"知乎是不是已经变成了论坛?","知乎和百度知道现在有什么区别?","知乎与李毅吧之间的本质区别是什么?",在现在定位为"高端社交问答社区"的zhihu.com出现这样的新手提问,总会让那些资深用户有一种受到了冒犯的感觉,而他们的回答往往也会带上一丝不屑和鄙视:"这样的问题要是再多一些,那两者就真的没区别了." 实际上,两者之间至少有一个明显的区别,那就是在知乎指南中说明的:"知乎有些地方其实很像

oelove v3.X 重点改善用户体验及优化技术底层

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 oelove v3.X 重点改善用户体验及优化技术底层等方面. 许多用户一直在问,oelove新版本v3到底出增加了什么功能,首先感谢这些一直关注我们成长的站长朋友们,你们的关注是我们发展的动力.在oelove v2.X使用中,许多站长通过线下与线上的方式结合取得了良好的效果,部份有经验的站长并己有开始盈利.更多的地方站长的运营方式较单一更需

改善用户体验的五款jQuery插件分享_jquery

1.菜单栏 清爽美观的菜单栏既能够向用户提供充分的吸引人的内容,又能让网站得体大方. Cool Animated Menu 演示|下载 2. tab 一个非常cool的tab既能够节省空间又能第一时间吸引用户眼球,这是提高用户体验的重要手段. Feature List 演示|下载 3. 登录/注册 登录/注册机制是巩固老用户和吸引新用户的重要方式,人性化的登录/注册机制才能为网站带来越来越多的用户.登录/注册机制要注意细节,最好把登录和注册放在一起,操作要便捷高效. A Cool Login S

SNS网站运营秘籍:注重前期引导改善用户体验

中介交易 SEO诊断 淘宝客 云主机 技术大厅 随着SNS的普及,UCenter Home(SNS)像Discuz!(BBS)一样成为网络社区建站的标配.为了更好的让更多的网络社区用好UCenter Home,我们特别准备UCenter Home(SNS)建站"运营秘籍"系列专题,把很多UCenter Home(SNS)实战应用的小技巧,与广大站长朋友们一起分享,愿UCenter Home和广大站长朋友一起成长. 注重前期引导,改善用户体验 一.邀请好友登陆页设置: 前段时间有朋友向我

天气通发布全新版本 改善用户体验

作为业内起步最早的天气应用,天气通始终改善用户体验,并把功能创新作为一种特色坚持至今.近日天气通同时发布了AndroidV2.4版和iPhoneV2.0版,又一次开创了天气应用的全新表现方式.天气通的老用户可能对去年8月新增的"天气随手拍"功能记忆犹新,通过用户拍摄照片即可让其他用户直观的看到天气情况,淡化了天气资讯一贯的数据罗列,是一次很大胆的尝试.新版本中"天气随手拍"功能已华丽变身为"实景天气",优化后的入口位于首页,用户可以一键进入,看照

22条改善用户体验的原则

  火鱼注:皮克斯动画工作室(Pixar Animation Studios),简称皮克斯.1986年,在史蒂夫·乔布斯以1000万入主以后,创作了<玩具总动员>.<海底总动员>.<头脑特工队>等经典3D动画电影.2006年,皮克斯被迪士尼以74亿美元收购,成为华特迪士尼公司的一部分. 几年前,Emma Coats在Twitter分享了她作为皮克斯(Pixar)分镜艺术家期间所学习到的,关于讲述故事的22条规则. 这些规则是"由在皮克斯(Pixar)的导演们和

新浪微博短链接正式更换为t.cn 改善用户体验

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 3月23日admin5站长网消息:今日新浪微博正式发出公告,微博中的短链接正式由sinaurl.cn变成t.cn.比原来短了六个字符,新的短链更简洁,而且为用户留出更多的文字空间,能让用户在带着链接的情况下多写三个字. 我们都知道,除搜狐微博对中英文输入没有限制外,国内几大微博都有严格的字数限制.腾讯和新浪微博将字数限制为140字;网易为163个字.将微博字数限制为140字来源于对于Twitter的模仿.但Twitter的140个字符,指的