AngularJSでいいねボタン作成


利用するもの


AngularJS
 ボタンクリック時などの各種機能を作る際に利用します。
 ※当記事は、AngularJSをある程度理解していることを前提で書いています。
 AngularJS — Superheroic JavaScript MVW Framework


propellerkit
 いいね数を表示するバッジを作る際に利用します。
 propeller.in 

font awesome icons
 いいねボタンのデザインを作る際に利用します。
 fontawesome.io



ボタンデザイン

 完成形がこちらになります。
 f:id:haruka-i1997:20170827230209p:plain

 早速HTMLを見てみましょう。

<div data-badge=0 class="material-icons pmd-md pmd-badge pmd-badge-overlap">
 <i class="fa fa-thumbs-up fa-lg" aria-hidden="true"></i>
</div>


 単純ですが少し解説してみます。

<i class="fa fa-thumbs-up fa-lg" aria-hidden="true"></i>

 この部分が  にあたります。

<div data-badge=0 class="material-icons pmd-md pmd-badge pmd-badge-overlap">
</div>

 この部分が青色のバッジにあたります。
 バッジをつけたい箇所に囲むかたちで使用します(今回は  ですね)

 「data-badge」の部分でバッジに表示する値を代入します。
 今は仮処理として初期値である「0」を代入しています。

 
 

クリックすると値が増える機能

 例えば
 f:id:haruka-i1997:20170827230209p:plain
 この状態でボタンをクリックすると

  f:id:haruka-i1997:20170827234342p:plain
 こうなる
 要はバッジの数が1つずつ増えていく機能です。

 ここからはAngularJSを利用していきます。
 
 ざざっとコードを見ていきましょう。
 まずはHTMLです。

<div data-badge={{good}} class="material-icons pmd-md pmd-badge pmd-badge-overlap">
<i class="fa fa-thumbs-up fa-lg" aria-hidden="true" ng-click="clickEvalute()"></i>
</div>


 次にJavascriptです。

$scope.good = 0; 
function clickEvalute(){
 $scope.good += 1;
}

 ※AngularJSの基本的なところは省いています。


 こちらも単純ですのでざっくりと解説します。
 
 ポイントは主に2つあります。

 1つ目は「data-badge」の部分です。
 先ほどは仮処理として直接「0」を代入していましたが、これを「{{good}}」におきかえ、
 javascript側で「good」に初期値の「0」をセットしました。
 
 2つ目は「ng-click」の部分です。
 ボタンをクリックするとjavasciptの「clickEvalute」関数が動作し、
 「good」に1が加算されます。
 加算した結果は「data-badge」の部分に反映されます。

 以上で「クリックすると値が増える機能」が完成です。



クリックするとデザインが変わる機能

 例えば
 f:id:haruka-i1997:20170827234342p:plain
 この状態でボタンをクリックすると

  f:id:haruka-i1997:20170828001639p:plain
 色が薄くなります。
 クリックしたかどうかを判別しやすくなります。

 この機能もAngularJSを利用します。

 まずはHTMLです。

<div data-badge={{good}} class="material-icons pmd-md pmd-badge pmd-badge-overlap">
<i class="fa fa-thumbs-up fa-lg" aria-hidden="true" ng-click="clickEvalute()"ng-style="goodStyle"></i>
</div>

 
 次にJavascriptです。

$scope.good = 0; 
$scope.goodStyle = "";
function clickEvalute(){
 $scope.good += 1;
 $scope.goodStyle = {color:'gray'};
}


 変更点は「ng-style」の部分のみです。
 ボタンをクリックして「clickEvalute」関数が動作すると、
 「goodStyle」にクリック後のスタイルが代入されます。
 これが「ng-style」に反映されることで、デザインを変更することができます。 
 
 
 

1度しかクリックできない機能

 一般的な「いいねボタン」は一度に何回もクリックできるものではないので、
 一度クリックすると、その後はバッジの値もデザインも変化しないようにしたいですね。

 色々とやり方はありますが、恐らく一番単純なのがフラグを利用する方法だと思います。

 変更するのはJavascriptのみです。

$scope.good = 0; 
$scope.goodStyle = "";
$scope.goodFlag = false;
function clickEvalute(){
 if(!$scope.goodFlag){
  $scope.good += 1;
  $scope.goodStyle = {color:'gray'};
  $scope.goodFlag = true;
 }
}


 「goodFlag」の初期値をfalseにして、
 「clickEvalute」関数が動作したときに「goodFlag」がfalseならば
 バッジの値とデザインの変更を行います。
 
 最後に、1度クリックした証として「goodFlag」をtrueにすれば
 2度目以降に「clickEvalute」関数が動作したときには、バッジの値やデザインの変更が
 行われない仕組みとなっています。

 
 本当は「ng-disabled」を使った方法を利用したかったのですが、
 調べてみるとbuttonにしか動作しない(?)ようなので、このような方法となりました。


 案外単純で簡潔なコードで作ることができて驚きです。
 ng-styleを使えばもっと色々なデザインが作れそうですね。
 時間があれば他の方法も模索していきたいと思います。
 
 以上です。