DRYな備忘録

Don't Repeat Yourself.

angularjsのviewでencodeURIComponentしたい

問題

angularのViewで(not controller)華麗にencodeURIComponentとかしたいじゃないですか、こんな感じで

<a href="/tasks/{{task.id | encodeURIComponent}}">{{task.name}}</a>

filterをカスタマイズしよう

angular.module('myapp', []).filter("encodeURIComponent", function() {
    return window.encodeURIComponent;
});

注意:functionを返すこと

他にも、

GMTなcron文字列を、JSTな日本語っぽくしたい

00 0 4 * * *

これを

毎曜日 毎月 毎日 13時 0分 00秒

こうじゃ

angular.module('myapp', []).filter('cron_humanize', function() {
  return function(input) {
    return _.chain(input.split(' ')).reverse().map(function(el) {
      if (el === '*') return '毎';
      return el;
    }).map(function(el, i) {
      switch (i) {
        case 0: return el + '曜日';
        case 1: return el + '月';
        case 2: return el + '日';
        case 3: return (el === '毎') ? el : (((el|0) + 9) % 24) + '時';
        case 4: return el + '分';
        case 5: return el + '秒';
      }
    }).value().join(' ');
  };
});

こうやって呼ぶ

<span>{{job.cron_string | cron_humanize}}</span>

実装は雑だけどまあ、フィルターのカスタマイズ方法の備忘録として

DRY