AngularJS Directive for Gravatar

目前公司在进行的项目中需要加入对 Gravatar 的支持,之前是通过 Ruby on Rails 在后端写一个 helper 方法来实现。而在查阅了一些资料之后,发现这在前端通过 AngularJS 来实现也是很容易的——通过 AngularJS 的一个核心功能 Directive。

首先来看看 Directive,什么是 Directive 呢?官方文档里面这样说到:

At a high level, directives are markers on a DOM element (such as an attribute, element name, or CSS class) that tell AngularJS's HTML compiler ($compile) to attach a specified behavior to that DOM element or even transform the DOM element and its children.

在我的理解来看,Directive 的实现可以自己定义一些有特殊功能的 template 加入到 HTML 中。显然,我 们需要的 Gravatar 功能就是 Directive 派上用场的时候了。

avatar.coffee:

app.directive 'avatar', (md5) ->  
  return {
    restrict: 'E',
    replace: true,
    template: '<img src="https://secure.gravatar.com/avatar/.png?s="/>'
    link: (scope, element, attrs) ->
      scope.size = attrs.size
      scope.gravatar_id = md5.createHash(attrs.email)
  }

HTML:

<avatar size="40" email="..."></avatar>

简单的说一下代码, avatar.coffee 中,首先要引入 md5 模块。因为 Gravatar 的地址是由用户的 email 进行 md5 加密生成的字符串和其他部分组成的。再来说说 Directive 中几个指令的含义:

  • restrict 表示对 Directive 形式的限制,E 表示 element, 还有其他的如 A,C 等等,具体查文档~
  • replace 表示是否用生成的模版替换 Directive,针对本代码来说若为 true,则 avatar 会被替换掉,false 的话则会将 template 生成的代码加入到 avatar 中
  • link 待续...