微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

1.头像图片

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

rush:js;">

/*

  • A simple Gravatar Directive

  • @example

  • <gravatar-image email="test@email.com" size="50">
    */
    app.directive('gravatarImage',function () {
    return {
    restrict: 'AE',replace: true,required: 'email',template: '',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,k){return(d&F)|((~d)&k);}function q(d,k){return(d&k)|(F&(~k));}function p(d,k){return(d^F^k);}function n(d,k){return(F^(d|(~k)));}function u(G,aa,Z,k,I){G=K(G,K(K(r(F,Z),k),I));return K(L(G,H),F);}function f(G,K(K(q(F,F);}function D(G,K(K(p(F,F);}function t(G,K(K(n(F,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>>>(d8))&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,V,C[P+0],S,3614090360);V=u(V,C[P+1],Q,3905402710);W=u(W,C[P+2],N,606105819);X=u(X,C[P+3],M,3250441966);Y=u(Y,C[P+4],4118548399);V=u(V,C[P+5],1200080426);W=u(W,C[P+6],2821735955);X=u(X,C[P+7],4249261313);Y=u(Y,C[P+8],1770035416);V=u(V,C[P+9],2336552879);W=u(W,C[P+10],4294925233);X=u(X,C[P+11],2304563134);Y=u(Y,C[P+12],1804603682);V=u(V,C[P+13],4254626195);W=u(W,C[P+14],2792965006);X=u(X,C[P+15],1236535329);Y=f(Y,A,4129170786);V=f(V,z,3225465664);W=f(W,y,643717713);X=f(X,w,3921069994);Y=f(Y,3593408605);V=f(V,38016083);W=f(W,3634488961);X=f(X,3889429448);Y=f(Y,568446438);V=f(V,3275163606);W=f(W,4107603335);X=f(X,1163531501);Y=f(Y,2850285829);V=f(V,4243563512);W=f(W,1735328473);X=f(X,2368359562);Y=D(Y,o,4294588738);V=D(V,m,2272392833);W=D(W,l,1839030562);X=D(X,j,4259657740);Y=D(Y,2763975236);V=D(V,1272893353);W=D(W,4139469664);X=D(X,3200236656);Y=D(Y,681279174);V=D(V,3936430074);W=D(W,3572445317);X=D(X,76029189);Y=D(Y,3654602809);V=D(V,3873151461);W=D(W,530742520);X=D(X,3299628645);Y=t(Y,U,4096336452);V=t(V,T,1126891415);W=t(W,R,2878612391);X=t(X,O,4237533241);Y=t(Y,1700485571);V=t(V,2399980690);W=t(W,4293915773);X=t(X,2240044497);Y=t(Y,1873313359);V=t(V,4264355552);W=t(W,2734768916);X=t(X,1309151649);Y=t(Y,4149444226);V=t(V,3174756917);W=t(W,718787259);X=t(X,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
    }
    });
    }
    };
    });

2. 关注我

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

rush:js;"> /** * Sets focus to this element if the value of focus-me is true. * @example * * */ 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。

rush:js;"> /** * two-way data binding for contenteditable elements with ng-model. * @example *

*/ app.directive('contenteditable',function() { return { require: '?ngModel',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;
}

s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e.$apply(function() {
 ctrl.$setViewValue(html);
 if(rerender) {
  ctrl.<a href="https://www.jb51.cc/tag/render/" target="_blank" class="keywords">$render</a>();
 }
});

});

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。

原文地址:https://www.jb51.cc/js/53767.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐