Can I do web?

AngularJS 中心の不定期ブログ

AngularJS で共通変数的なアレを定義する

 

 

先日(7/3)開催した ng-mtg#3 AngularJS 勉強会 1周年記念! の @agektmr さんのセッションで紹介された、AngularJS のベストプラクティスです。
デモで使われたコードはこちらです

 

AngularJS を使ってみると、個々に controller や directive をあれこれするのはさほど難しくないのですが、例えば、controller A で使う変数と directive B で使う変数を共通で使いたい場合に、これを知らないと悩むんじゃないかな〜と思います。

angular.module() の .value() というメソッドを使います。
( 厳密には $provide.value() ですけど気にしない! )

 

1.定義する

まずはモジュール( myModule とします )を作ります。

その後に .value() として、引数に key - value 形式で共通変数にしたいデータを定義します。

こうすることで myModule 内で共通的に使えるオブジェクトが定義できます。

angular.module('myModule', ).value(
  'keyName', {
    'value1': 'can',
    'value2': ['i', 'do', 'web'],
    'value3': 12345
  }
);

2.つかいかた

上のコードにさらにコードを追記して、.value() で定義したデータを使ってみます。

angular.module('myModule', ).value(
  'keyName', {
    'value1': 'can',
    'value2': ['i', 'do', 'web'],
    'value3': 12345
  }
)
.controller('myController', function($scope, keyName){
  $scope.someModel = keyName.value1;
})
.directive('myDirective', function(keyName){
  return {
    // 省略
  }
});

追記したコードは controller と directive を作っただけのものになりますが、 それぞれの function の記述の引数に 1.で定義した keyName というオブジェクトを渡しています。

こうすることで、controller でも directive でも共通的な変数を扱うことができます。
ちょー簡単&便利!

controller の方を見ると、$scope.someModel というモデルに値をバインディングして使ったりもできます。

 

これは絶対覚えておくべきですよー!!