カテゴリー別アーカイブ: コーディング

AngularJSコードサンプル(サービス)

AngularJS : 1.6.5
Bootstrap : 3.3.7
 
※v1.2.3のサンプルはこちら
 
■目次
(1)AngularJSのサービス factory、service、provider
(2)AngularJSの$qサービスでpromises/deferredパターン
(3)AngularJSの$httpサービスの基本
(4)AngularJSの$httpサービスでPOST送信
(5)AngularJSの$qサービスを使ってhttpリクエストを複数実行
(6)AngularJSの$timeoutサービスと$intervalサービス
(7)$locationサービス
(8)$rootScopeを使ってコントローラ間でデータをやり取り

(1)AngularJSのサービス factory、service、provider

1)コントローラのみの場合

SubCtrl-A

  • {{item.id}}=>{{item.msg}}

SubCtrl-B

  • {{item.id}}=>{{item.msg}}

2)サービスを使ってコントローラ間でログを共有

SubCtrl-A

  • {{item.id}}=>{{item.msg}}

SubCtrl-B

  • {{item.id}}=>{{item.msg}}


1)コントローラのみの場合
<div ng-controller="mainCtrl">
<button ng-click="open('SubCtrl-A')">SubCtrl-A</button>
<button ng-click="open('SubCtrl-B')">SubCtrl-B</button>
<div ng-switch on="tab">
  <div ng-switch-when="SubCtrl-A">
    <div ng-controller="subCtrl">
      <h3>SubCtrl-A</h3>
      <ul>
        <li ng-repeat="item in logs">
          {{item.id}}=>{{item.msg}}
        </li>
      </ul>
      <button ng-click="add('Aのテストログメッセージ')">ログ記録</button>
    </div>
  </div>
  <div ng-switch-when="SubCtrl-B">
    <div ng-controller="subCtrl">
      <h3>SubCtrl-B</h3>
      <ul>
        <li ng-repeat="item in logs">
          {{item.id}}=>{{item.msg}}
        </li>
      </ul>
      <button ng-click="add('Bのテストログメッセージ')">ログ記録</button>
    </div>
  </div>
</div>
</div>
2)サービスを使ってコントローラ間でログを共有<br />
<div ng-controller="mainCtrl">
<button ng-click="open('SubCtrl-A')">SubCtrl-A</button>
<button ng-click="open('SubCtrl-B')">SubCtrl-B</button>
<div ng-switch on="tab">
  <div ng-switch-when="SubCtrl-A">
    <div ng-controller="subCtrl1">
      <h3>SubCtrl-A</h3>
      <ul>
        <li ng-repeat="item in lists()">
          {{item.id}}=>{{item.msg}}
        </li>
      </ul>
      <button ng-click="add('Aのテストログメッセージ')">ログ記録</button>
    </div>
  </div>
  <div ng-switch-when="SubCtrl-B">
    <div ng-controller="subCtrl1">
      <h3>SubCtrl-B</h3>
      <ul>
        <li ng-repeat="item in lists()">
          {{item.id}}=>{{item.msg}}
        </li>
      </ul>
      <button ng-click="add('Bのテストログメッセージ')">ログ記録</button>
    </div>
  </div>
</div>
</div>

1)コントローラのみの場合
var demoApp = angular.module('demoApp', []);

demoApp.controller('mainCtrl', function($scope) {
  $scope.tab = 'SubCtrl-A';
  $scope.open = function(tab) {
    $scope.tab = tab;
  };
});

demoApp.controller('subCtrl', function($scope) {
  $scope.logs = [];
  var logCount = 0;
  $scope.add = function(msg) {
    $scope.logs.push({
      id: ++logCount,
      msg: msg
    });
  };
});
2)サービスを使ってコントローラ間でログを共有
var demoApp = angular.module('demoApp', []);

demoApp.provider("LogService", function () {
  var logLevel = "Error";
  return {
    debugEnabled: function(chk) {
      if (chk) {
        logLevel = "Debug";
      }
      return logLevel;
    },
    $get: function () {
      var logs = [];
      var logCount = 0;
      return {
        lists: function() {
          return logs;
        },
        add: function(msg) {
          logs.push({
            id: ++logCount,
            msg: "[" + logLevel + "]" + msg
          });
        }
      }
    }
  }
});

demoApp.config(function(LogServiceProvider) {
  LogServiceProvider.debugEnabled(true);
});

demoApp.controller('mainCtrl', function($scope) {
  $scope.tab = 'SubCtrl-A';
  $scope.open = function(tab) {
    $scope.tab = tab;
  };
});

demoApp.controller('subCtrl1', function($scope,LogService) {
  $scope.lists = function() {
    return LogService.lists();
  };
  $scope.add = function(msg) {
    LogService.add(msg);
  };
});

※①factoryメソッドを使った場合
demoApp.factory('LogService', function() {
  var logs = [];
  var logCount = 0;
  var logLevel = "Error";
  return {
    lists: function() {
      return logs;
    },
    add: function(msg) {
      logs.push({
        id: ++logCount,
        msg: "[" + logLevel + "]" + msg
      });
    }
  };
});

※②serviceメソッドを使った場合
var Logger = function () {
  this.logs = [];
  this.logCount = 0;
  this.lists = function() {
    return this.logs;
  };
  this.add = function(msg) {
    this.logs.push({
      id: ++this.logCount,
      msg: "[" + this.logLevel + "]" + msg
    });
  };
};
var errorLogger = function () { };
errorLogger.prototype = new Logger();
errorLogger.prototype.logLevel = "Error";

angular.module('demoApp', [])
.service("LogService", errorLogger)

(2)AngularJSの$qサービスでpromises/deferredパターン

 
{{msg}}


<button ng-click="q_get(true)">msg取得(成功)</button>
<button ng-click="q_get(false)">msg取得(失敗)</button><br />
{{msg}}

var demoApp = angular.module('demoApp', []);

demoApp.factory('qService', function($timeout) {
  var totalnum=0;
  return {
    q_get: function(deferred,tf) {
      var updateValue = function(){
        $timeout(function(){
          totalnum++;
          if (tf) {
            deferred.resolve("サービス処理成功 全回数:" + totalnum );
          } else {
            deferred.reject("サービス処理失敗 全回数:" + totalnum );
          }
        },3000,true,tf);
      }
      updateValue();
    }
  }
});

demoApp.controller('qCtrl', function($scope,qService,$q) {
  $scope.q_get = function(tf) {
    $scope.msg = "処理中・・・";
    var deferred = $q.defer();
    deferred.promise.then(function (result) {
      $scope.msg = result;
    },function (reason) {
      $scope.msg = reason;
    })
    qService.q_get(deferred,tf);
  };
});

(3)AngularJSの$httpサービスの基本


Getリクエストでサーバー内のJSONファイルデータ取得

 
レスポンスステータス、ヘッダー

レスポンスデータ

名前 年齢 住所
{{item.id}} {{item.name}} {{item.age}} {{item.address}}

<button ng-click="getFriends(true)">データ取得</button><br />
<button ng-click="getFriends(false)">データ取得(エラー)</button><br />
<strong>レスポンスステータス、ヘッダー</strong><br />
<textarea class="form-control" rows="5">{{getFriendsResult}}</textarea>
<strong>レスポンスデータ</strong><br />
    <table class="table table-striped">
  <thead>
    <tr>
      <th>№</th><th>名前</th><th>年齢</th><th>住所</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends" >
      <td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.age}}</td><td>{{item.address}}</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);

demoApp.controller('http1Ctrl', function ($scope, $http) {
  var showResult = function (status, headers, config) {
    return "status: " + status + "\n\n" +
      "headers(レスポンスヘッダー): " + angular.toJson(headers(),true) + "\n\n
" +
      "config(リクエストのconfig): " + angular.toJson(config,true);
  };

  $scope.getFriends = function (tf) {
    var svrURL = (tf ? "../../wp-content/themes/wp/json/friends.json" :
 "invalid-url.php");
    var config = {};
    $http.get(svrURL, config)
      .then(function onSuccess(response) {
        $scope.getFriendsResult = showResult(response.status, response.headers, response.config);
        $scope.friends = response.data;
      }, function onError(response) {
        $scope.getFriendsResult = showResult(response.status, response.headers, response.config);
      });
  };
});

[
  {"id": 1, "name": "相田", "age": 20, "address": "東京都品川区"},
  {"id": 2, "name": "伊藤", "age": 55, "address": "神奈川県横浜市"},
  {"id": 3, "name": "上野", "age": 20, "address": "埼玉県川越市"},
  {"id": 4, "name": "江藤", "age": 37, "address": "東京都世田谷区"}
]

(4)AngularJSの$httpサービスでPOST送信

送信するデータ
{{send_data}}
1)AngularJSのデフォルト(JSONフォーマット)で送信

2)ヘッダー設定と送信データ変換を行ってx-www-form-urlencoded形式で送信


<span>送信するデータ</span><br />
<span>{{send_data}}</span><br />
<strong>1)AngularJSのデフォルト(JSONフォーマット)で送信</strong><br />
<button ng-click="postCall(false)">送信</button><br />
<strong>2)ヘッダー設定と送信データ変換を行ってx-www-form-urlencoded形式で送信</strong><br />
<button ng-click="postCall(true)">送信</button><br />
<textarea class="form-control" rows="3">{{postCallResult}}</textarea>

var demoApp = angular.module('demoApp', []);

demoApp.controller('transCtrl', function ($scope, $http) {
  var logResult = function (data, status, config) {
    if(angular.isObject(data)) {
      data = angular.toJson(data,true);
    }
    return "ステータス: " + status + "\n" +
      "送信データ: " + data + "\n" +
      "Content-Type: " + config.headers["Content-Type"] ;
  };
  $scope.send_data ={
    id: "0101",
    name: "鈴木"
  };
  $scope.postCall = function (trans) {
    if(trans){
      var config = {
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        transformRequest: function(data) {
          var transStr;
          if (data) {
            for (var key in data) {
              if (transStr) {
                transStr += '&' + key + '=' + data[key];
              } else {
                transStr = key + '=' + data[key];
              }
            }
          }
          return transStr;
        }
      };
    }else{
      var config = {};
    }
    $http.post("../../wp-content/themes/wp/post_test.php", $scope.send_data, config)
      .then(function onSuccess(response) {
        $scope.postCallResult = logResult(response.data,response.status,response.config);
      }, function onError(response) {
        $scope.postCallResult = logResult(response.data,response.status,response.config);
      });
  };
});

(5)AngularJSの$qサービスを使ってhttpリクエストを複数実行

3つのhttpリクエストをチェインして実行

  • {{result1}}

3つのhttpリクエストを$q.allで実行

  • {{result2}}

httpリクエストをループ処理

  • {{result3}}

    3つのhttpリクエストをチェインして実行<br />
    <button ng-click="chain()">実行</button><br />
    <ul>
      <li ng-repeat="result1 in results1">
        <span>{{result1}}</span>
      </li>
    </ul>
    3つのhttpリクエストを$q.allで実行<br />
    <button ng-click="all()">実行</button><br />
    <ul>
      <li ng-repeat="result2 in results2">
        <span>{{result2}}</span>
      </li>
    </ul>
    httpリクエストをループ処理<br />
    <button ng-click="loop()">実行</button><br />
    <ul>
      <li ng-repeat="result3 in results3">
        <span>{{result3}}</span>
      </li>
    </ul>

var demoApp = angular.module('demoApp', []);

demoApp.controller('chainCtrl', function ($scope, $http, $q) {
  $scope.chain = function() {
    $scope.results1 = [];
    $http.get("/ng/q_chain.php?first=5").then(function onSuccess(response) {
      $scope.results1.push(response.data);
      $http.get("/ng/q_chain.php?second=1").then(function onSuccess(response) {
        $scope.results1.push(response.data);
        $http.get("/ng/q_chain.php?third=3").then(function onSuccess(response) {
          $scope.results1.push(response.data);
        });
      });
    });
  };

  $scope.all = function() {
    $scope.results2 = [];
    var first  = $http.get("/ng/q_chain.php?first=5"),
        second = $http.get("/ng/q_chain.php?second=1"),
        third  = $http.get("/ng/q_chain.php?third=3");

    $q.all([first, second, third]).then(function(result) {
      angular.forEach(result, function(response) {
        $scope.results2.push(response.data);
      });
    });
  };

  $scope.loop = function() {
    $scope.results3 = [];
    $http.get("/ng/q_chain.php?init=1")
      .then(function onSuccess(response) {
        var total = response.data.length;
        var https = [];
        for(i=0; i < total;i++) {
          var cur = i;
          var ary = [response.data[i][1]];
          $scope.results3.push(ary);
          var url = "/ng/q_chain.php?" + response.data[i][0];
          var http = $http.get(url);
          https.push(http);
        };
        $q.all(https).then(function(result) {
          i=0;
          angular.forEach(result, function(response1) {
            $scope.results3[i].push(response1.data[0],response1.data[1],response1.data[2]);
            i++;
          });
        });
      });
  };
});

(6)AngularJSの$timeoutサービスと$intervalサービス

 

SubCtrl-A $intervalのサンプルコード

現在の時刻:{{time}}

SubCtrl-B $timeoutのサンプルコード

{{msg}}


<button ng-click="open('timeSubCtrl-A')">SubCtrl-A</button>
<button ng-click="open('timeSubCtrl-B')">SubCtrl-B</button>
<div ng-switch on="tab">
  <div ng-switch-when="timeSubCtrl-A">
    <div ng-controller="timeSubCtrl">
      <strong>SubCtrl-A</strong><br />
      <strong>$intervalのサンプルコード</strong><br />
      <button ng-click="intervalRun()">実行</button><br />
      <span>現在の時刻:{{time}}</span>
    </div>
  </div>
  <div ng-switch-when="timeSubCtrl-B">
    <div ng-controller="timeSubCtrl">
      <strong>SubCtrl-B</strong><br />
      <strong>$timeoutのサンプルコード</strong><br />
      <button ng-click="delayRun()">実行</button><br />
      <span>{{msg}}</span><br />
    </div>
  </div>
</div>

var demoApp = angular.module('demoApp', []);

demoApp.controller('timeMainCtrl', function($scope) {
  $scope.tab = 'timeSubCtrl-A'; 
  $scope.open = function(tab) {
    $scope.tab = tab;
  };
});

demoApp.controller('timeSubCtrl', function ($scope,$timeout,$interval) {
  var time;
  $scope.delayRun = function(){
    $scope.msg = "実行開始" + new Date().toLocaleTimeString() + "->";
    $timeout(function(){
      $scope.msg += "実行終了" + new Date().toLocaleTimeString();
    },5000);
  }
  $scope.intervalRun = function(){
    time = $interval(function () {
      $scope.time = new Date().toLocaleTimeString();
      console.log($scope.time);
    }, 2000);
  }
  var intervalStop = function() {
    if (angular.isDefined(time)) {
      $interval.cancel(time);
      time = undefined;
    }
  };
  $scope.$on('$destroy', function() {
    console.log("destroy");
    intervalStop();
  });
});

(7)$locationサービス

1)path、search、hash、urlの指定方法

  • Path:URLのパス(Searchパラメータとhashを除いた部分)を指定
  • Search:クエリパラメータ(?名前1=値1&名前2=値2)を指定
  • Hash:ハッシュ"#value"を指定
  • URL:Path、Search、Hashを含めて指定

URL:{{url}}

2)$anchorScrollを使ってページ内スクロール

  • {{item.title}}


1)path、search、hash、urlの指定方法<br />
<div ng-controller="locationCtrl">
  <ul>
    <li>Path:URLのパス(Searchパラメータとhashを除いた部分)を指定</li>
    <li>Search:クエリパラメータ(?名前1=値1&名前2=値2)を指定</li>
    <li>Hash:ハッシュ"#value"を指定</li>
    <li>URL:Path、Search、Hashを含めて指定</li>
  </ul>
  <div class="btn-group ">
    <button class="btn btn-primary" ng-click="setUrl('reset')">Reset</button><button class="btn btn-primary" ng-click="setUrl('path')">Path</button><button class="btn btn-primary" ng-click="setUrl('search')">Search</button><button class="btn btn-primary" ng-click="setUrl('hash')">Hash</button><button class="btn btn-primary" ng-click="setUrl('url')">URL</button>
  </div>
  <p>URL:{{url}}</p>
</div>

2)$anchorScrollを使ってページ内スクロール<br />
<div ng-controller="location2Ctrl">
  <input type="number" ng-model="showID" /><button class="btn btn-primary" ng-click="show(showID)">指定した記事へ</button>
  <ul>
    <li ng-repeat="item in items">
      <span id={{$index+1}} ng-class="{'bg-primary': item.focus}">{{item.title}}</span>
    </li>
  </ul>
  <button class="btn btn-primary" ng-click="show(1)">先頭の記事へ</a>
</div>

var demoApp = angular.module('demoApp', []);

demoApp.controller("locationCtrl", function ($scope, $location) {
  $scope.$on("$locationChangeSuccess", function (event) {
     $scope.url = $location.url();
  });
  var pathID = 0;
  var hashID = 0;
  var searchID = 0;
  $scope.setUrl = function (component) {
    switch (component) {
      case "reset":
        $location.url("/#nglocation");
        pathID = 0;
        hashID = 0;
        searchID = 0;
        break;
      case "path":
        ++pathID;
        $location.path("/path_A" + pathID + "/path_B" + pathID );
        break;
      case "search":
        ++searchID;
        $location.search("search" + searchID, "value" + searchID);
        break;
      case "hash":
        ++hashID;
        $location.hash("hash" + hashID);
        break;
      case "url":
        ++pathID;
        ++searchID;
        ++hashID;
        $location.url("/path_A" + pathID + "/path_B" + pathID + "?search" + searchID + "=value" + searchID + "#hash" + hashID);
        break;
    }
  }
});

demoApp.controller("location2Ctrl", function ($scope, $location, $anchorScroll)
{
  $scope.items = [];
  for (var i = 0; i < 30; i++) {
    $scope.items[i] = {
      title: "記事 " + (i + 1),
      focus: false
    };
  }
  $scope.show = function(id) {
    $location.hash(id);
    for (var i = 0; i < $scope.items.length; i++) {
      $scope.items[i].focus = false;
    };
    $scope.items[id-1].focus = true;
  }
});

(8)$rootScopeを使ってコントローラ間でデータをやり取り

Controller-A






{{success}}

{{info}}

{{warning}}

{{danger}}

Controller-B






{{success}}

{{info}}

{{warning}}

{{danger}}


<div class="well" ng-controller="scopeCtrl">
  <h4>Controller-A</h4>
  <form>
    <label>タイプ</label>
    <select ng-model="type" ng-options="item for item in types"></select>
    <label>メッセージ</label>
    <input ng-model="msg"><br />
    <button class="btn btn-primary" ng-click="alert(type, msg)">Send Alert</button>
  </form>
  <div ng-if="success != null">
    <p class="bg-success">{{success}}</p>
  </div>
  <div ng-if="info != null">
    <p class="bg-info">{{info}}</p>
  </div>
  <div ng-if="warning != null">
    <p class="bg-warning">{{warning}}</p>
  </div>
  <div ng-if="danger != null">
    <p class="bg-danger">{{danger}}</p>
  </div>
</div>
<div class="well" ng-controller="scopeCtrl">
  <h4>Controller-B</h4>
  <form>
    <label>タイプ</label>
    <select ng-model="type" ng-options="item for item in types"></select>
    <label>メッセージ</label>
    <input ng-model="msg"><br />
    <button class="btn btn-primary" ng-click="alert(type, msg)">Send Alert</button>
  </form>
  <div ng-if="success != null">
    <p class="bg-success">{{success}}</p>
  </div>
  <div ng-if="info != null">
    <p class="bg-info">{{info}}</p>
  </div>
  <div ng-if="warning != null">
    <p class="bg-warning">{{warning}}</p>
  </div>
  <div ng-if="danger != null">
    <p class="bg-danger">{{danger}}</p>
  </div>
</div>

var demoApp = angular.module('demoApp', []);

demoApp.controller("scopeCtrl", function ($scope, $rootScope) {
  $scope.types = ['success','info','warning','danger'];
  $scope.$on("globalAlert", function (event, args) {
    $scope[args.type] = args.msg;
  });
  $scope.alert = function (type, msg) {
    $rootScope.$broadcast("globalAlert", {
      type: type, msg: msg
    });
  }
});


関連記事の目次

AngularJSコードサンプル(サービスv1.2.23)

AngularJS : 1.2.23
Bootstrap : 3.2.0
 
■目次
(1)AngularJSのサービス factory、service、provider
(2)AngularJSの$qサービスでpromises/deferredパターン
(3)AngularJSの$httpサービスの基本
(4)AngularJSの$httpサービスでPOST送信
(5)AngularJSの$qサービスを使ってhttpリクエストを複数実行
(6)AngularJSの$timeoutサービスと$intervalサービス
(7)$locationサービス
(8)$rootScopeを使ってコントローラ間でデータをやり取り

(1)AngularJSのサービス factory、service、provider

1)コントローラのみの場合

SubCtrl-A

  • {{item.id}}=>{{item.msg}}

SubCtrl-B

  • {{item.id}}=>{{item.msg}}

2)サービスを使ってコントローラ間でログを共有

SubCtrl-A

  • {{item.id}}=>{{item.msg}}

SubCtrl-B

  • {{item.id}}=>{{item.msg}}


1)コントローラのみの場合
<div ng-controller="mainCtrl">
<button ng-click="open('SubCtrl-A')">SubCtrl-A</button>
<button ng-click="open('SubCtrl-B')">SubCtrl-B</button>
<div ng-switch on="tab">
  <div ng-switch-when="SubCtrl-A">
    <div ng-controller="subCtrl">
      <h3>SubCtrl-A</h3>
      <ul>
        <li ng-repeat="item in logs">
          {{item.id}}=>{{item.msg}}
        </li>
      </ul>
      <button ng-click="add('Aのテストログメッセージ')">ログ記録</button>
    </div>
  </div>
  <div ng-switch-when="SubCtrl-B">
    <div ng-controller="subCtrl">
      <h3>SubCtrl-B</h3>
      <ul>
        <li ng-repeat="item in logs">
          {{item.id}}=>{{item.msg}}
        </li>
      </ul>
      <button ng-click="add('Bのテストログメッセージ')">ログ記録</button>
    </div>
  </div>
</div>
</div>
2)サービスを使ってコントローラ間でログを共有<br />
<div ng-controller="mainCtrl">
<button ng-click="open('SubCtrl-A')">SubCtrl-A</button>
<button ng-click="open('SubCtrl-B')">SubCtrl-B</button>
<div ng-switch on="tab">
  <div ng-switch-when="SubCtrl-A">
    <div ng-controller="subCtrl1">
      <h3>SubCtrl-A</h3>
      <ul>
        <li ng-repeat="item in lists()">
          {{item.id}}=>{{item.msg}}
        </li>
      </ul>
      <button ng-click="add('Aのテストログメッセージ')">ログ記録</button>
    </div>
  </div>
  <div ng-switch-when="SubCtrl-B">
    <div ng-controller="subCtrl1">
      <h3>SubCtrl-B</h3>
      <ul>
        <li ng-repeat="item in lists()">
          {{item.id}}=>{{item.msg}}
        </li>
      </ul>
      <button ng-click="add('Bのテストログメッセージ')">ログ記録</button>
    </div>
  </div>
</div>
</div>

1)コントローラのみの場合
var demoApp = angular.module('demoApp', []);

demoApp.controller('mainCtrl', function($scope) {
  $scope.tab = 'SubCtrl-A';
  $scope.open = function(tab) {
    $scope.tab = tab;
  };
});

demoApp.controller('subCtrl', function($scope) {
  $scope.logs = [];
  var logCount = 0;
  $scope.add = function(msg) {
    $scope.logs.push({
      id: ++logCount,
      msg: msg
    });
  };
});
2)サービスを使ってコントローラ間でログを共有
var demoApp = angular.module('demoApp', []);

demoApp.provider("LogService", function () {
  var logLevel = "Error";
  return {
    debugEnabled: function(chk) {
      if (chk) {
        logLevel = "Debug";
      }
      return logLevel;
    },
    $get: function () {
      var logs = [];
      var logCount = 0;
      return {
        lists: function() {
          return logs;
        },
        add: function(msg) {
          logs.push({
            id: ++logCount,
            msg: "[" + logLevel + "]" + msg
          });
        }
      }
    }
  }
});

demoApp.config(function(LogServiceProvider) {
  LogServiceProvider.debugEnabled(true);
});

demoApp.controller('mainCtrl', function($scope) {
  $scope.tab = 'SubCtrl-A';
  $scope.open = function(tab) {
    $scope.tab = tab;
  };
});

demoApp.controller('subCtrl1', function($scope,LogService) {
  $scope.lists = function() {
    return LogService.lists();
  };
  $scope.add = function(msg) {
    LogService.add(msg);
  };
});

※①factoryメソッドを使った場合
demoApp.factory('LogService', function() {
  var logs = [];
  var logCount = 0;
  var logLevel = "Error";
  return {
    lists: function() {
      return logs;
    },
    add: function(msg) {
      logs.push({
        id: ++logCount,
        msg: "[" + logLevel + "]" + msg
      });
    }
  };
});

※②serviceメソッドを使った場合
var Logger = function () {
  this.logs = [];
  this.logCount = 0;
  this.lists = function() {
    return this.logs;
  };
  this.add = function(msg) {
    this.logs.push({
      id: ++this.logCount,
      msg: "[" + this.logLevel + "]" + msg
    });
  };
};
var errorLogger = function () { };
errorLogger.prototype = new Logger();
errorLogger.prototype.logLevel = "Error";

angular.module('demoApp', [])
.service("LogService", errorLogger)

(2)AngularJSの$qサービスでpromises/deferredパターン

 
{{msg}}


<button ng-click="q_get(true)">msg取得(成功)</button>
<button ng-click="q_get(false)">msg取得(失敗)</button><br />
{{msg}}

var demoApp = angular.module('demoApp', []);

demoApp.factory('qService', function($timeout) {
  var totalnum=0;
  return {
    q_get: function(deferred,tf) {
      var updateValue = function(){
        $timeout(function(){
          totalnum++;
          if (tf) {
            deferred.resolve("サービス処理成功 全回数:" + totalnum );
          } else {
            deferred.reject("サービス処理失敗 全回数:" + totalnum );
          }
        },3000,true,tf);
      }
      updateValue();
    }
  }
});

demoApp.controller('qCtrl', function($scope,qService,$q) {
  $scope.q_get = function(tf) {
    $scope.msg = "処理中・・・";
    var deferred = $q.defer();
    deferred.promise.then(function (result) {
      $scope.msg = result;
    },function (reason) {
      $scope.msg = reason;
    })
    qService.q_get(deferred,tf);
  };
});

(3)AngularJSの$httpサービスの基本


Getリクエストでサーバー内のJSONファイルデータ取得

 
レスポンスステータス、ヘッダー

レスポンスデータ

名前 年齢 住所
{{item.id}} {{item.name}} {{item.age}} {{item.address}}

<button ng-click="getFriends(true)">データ取得</button><br />
<button ng-click="getFriends(false)">データ取得(エラー)</button><br />
<strong>レスポンスステータス、ヘッダー</strong><br />
<textarea class="form-control" rows="5">{{getFriendsResult}}</textarea>
<strong>レスポンスデータ</strong><br />
    <table class="table table-striped">
  <thead>
    <tr>
      <th>№</th><th>名前</th><th>年齢</th><th>住所</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends" >
      <td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.age}}</td><td>{{item.address}}</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);

demoApp.controller('http1Ctrl', function ($scope, $http) {
  var showResult = function (status, headers, config) {
    return "status: " + status + "\n\n" +
      "headers(レスポンスヘッダー): " + angular.toJson(headers(),true) + "\n\n
" +
      "config(リクエストのconfig): " + angular.toJson(config,true);
  };

  $scope.getFriends = function (tf) {
    var svrURL = (tf ? "../../wp-content/themes/wp/json/friends.json" :
 "invalid-url.php");
    var config = {};
    $http.get(svrURL, config)
      .success(function (data, status, headers, config) {
        $scope.getFriendsResult = showResult(status, headers, config);
        $scope.friends = data;
      })
      .error(function (data, status, headers, config) {
        $scope.getFriendsResult = showResult(status, headers, config);
        $scope.friends = [];
      });
  };
});

[
  {"id": 1, "name": "相田", "age": 20, "address": "東京都品川区"},
  {"id": 2, "name": "伊藤", "age": 55, "address": "神奈川県横浜市"},
  {"id": 3, "name": "上野", "age": 20, "address": "埼玉県川越市"},
  {"id": 4, "name": "江藤", "age": 37, "address": "東京都世田谷区"}
]

(4)AngularJSの$httpサービスでPOST送信

送信するデータ
{{send_data}}
1)AngularJSのデフォルト(JSONフォーマット)で送信

2)ヘッダー設定と送信データ変換を行ってx-www-form-urlencoded形式で送信


<span>送信するデータ</span><br />
<span>{{send_data}}</span><br />
<strong>1)AngularJSのデフォルト(JSONフォーマット)で送信</strong><br />
<button ng-click="postCall(false)">送信</button><br />
<strong>2)ヘッダー設定と送信データ変換を行ってx-www-form-urlencoded形式で送信</strong><br />
<button ng-click="postCall(true)">送信</button><br />
<textarea class="form-control" rows="3">{{postCallResult}}</textarea>

var demoApp = angular.module('demoApp', []);

demoApp.controller('transCtrl', function ($scope, $http) {
  var logResult = function (data, status, config) {
    if(angular.isObject(data)) {
      data = angular.toJson(data,true);
    }
    return "ステータス: " + status + "\n" +
      "送信データ: " + data + "\n" +
      "Content-Type: " + config.headers["Content-Type"] ;
  };
  $scope.send_data ={
    id: "0101",
    name: "鈴木"
  };
  $scope.postCall = function (trans) {
    if(trans){
      var config = {
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        transformRequest: function(data) {
          var transStr;
          if (data) {
            for (var key in data) {
              if (transStr) {
                transStr += '&' + key + '=' + data[key];
              } else {
                transStr = key + '=' + data[key];
              }
            }
          }
          return transStr;
        }
      };
    }else{
      var config = {};
    }
    $http.post("../../wp-content/themes/wp/post_test.php", $scope.send_data, config)
      .success(function (data, status, headers, config) {
        $scope.postCallResult = logResult(data, status, config);
      })
      .error(function (data, status, headers, config) {
        $scope.postCallResult = logResult(data, status, config);
      });
  };
});

(5)AngularJSの$qサービスを使ってhttpリクエストを複数実行

3つのhttpリクエストをチェインして実行

  • {{result1}}

3つのhttpリクエストを$q.allで実行

  • {{result2}}

httpリクエストをループ処理

  • {{result3}}

    3つのhttpリクエストをチェインして実行<br />
    <button ng-click="chain()">実行</button><br />
    <ul>
      <li ng-repeat="result1 in results1">
        <span>{{result1}}</span>
      </li>
    </ul>
    3つのhttpリクエストを$q.allで実行<br />
    <button ng-click="all()">実行</button><br />
    <ul>
      <li ng-repeat="result2 in results2">
        <span>{{result2}}</span>
      </li>
    </ul>
    httpリクエストをループ処理<br />
    <button ng-click="loop()">実行</button><br />
    <ul>
      <li ng-repeat="result3 in results3">
        <span>{{result3}}</span>
      </li>
    </ul>

var demoApp = angular.module('demoApp', []);

demoApp.controller('chainCtrl', function ($scope, $http, $q) {
  $scope.chain = function() {
    $scope.results1 = [];
    $http.get("/ng/q_chain.php?first=5").success(function(data) {
      $scope.results1.push(data);
      $http.get("/ng/q_chain.php?second=1").success(function(data) {
        $scope.results1.push(data);
        $http.get("/ng/q_chain.php?third=3").success(function(data) {
          $scope.results1.push(data);
        });
      });
    });
  };

  $scope.all = function() {
    $scope.results2 = [];
    var first  = $http.get("/ng/q_chain.php?first=5"),
        second = $http.get("/ng/q_chain.php?second=1"),
        third  = $http.get("/ng/q_chain.php?third=3");

    $q.all([first, second, third]).then(function(result) {
      angular.forEach(result, function(response) {
        $scope.results2.push(response.data);
      });
    });
  };

  $scope.loop = function() {
    $scope.results3 = [];
    $http.get("/ng/q_chain.php?init=1")
      .success(function(data) {
        var total = data.length;
        var https = [];
        for(i=0; i < total;i++) {
          var cur = i;
          var ary = [data[i][1]];
          $scope.results3.push(ary);
          var url = "/ng/q_chain.php?" + data[i][0];
          var http = $http.get(url);
          https.push(http);
        };
        $q.all(https).then(function(result) {
          i=0;
          angular.forEach(result, function(response) {
            $scope.results3[i].push(response.data[0],response.data[1],response.data[2]);
            i++;
          });
        });
      });
  };
});

(6)AngularJSの$timeoutサービスと$intervalサービス

 

SubCtrl-A $intervalのサンプルコード

現在の時刻:{{time}}

SubCtrl-B $timeoutのサンプルコード

{{msg}}


<button ng-click="open('timeSubCtrl-A')">SubCtrl-A</button>
<button ng-click="open('timeSubCtrl-B')">SubCtrl-B</button>
<div ng-switch on="tab">
  <div ng-switch-when="timeSubCtrl-A">
    <div ng-controller="timeSubCtrl">
      <strong>SubCtrl-A</strong><br />
      <strong>$intervalのサンプルコード</strong><br />
      <button ng-click="intervalRun()">実行</button><br />
      <span>現在の時刻:{{time}}</span>
    </div>
  </div>
  <div ng-switch-when="timeSubCtrl-B">
    <div ng-controller="timeSubCtrl">
      <strong>SubCtrl-B</strong><br />
      <strong>$timeoutのサンプルコード</strong><br />
      <button ng-click="delayRun()">実行</button><br />
      <span>{{msg}}</span><br />
    </div>
  </div>
</div>

var demoApp = angular.module('demoApp', []);

demoApp.controller('timeMainCtrl', function($scope) {
  $scope.tab = 'timeSubCtrl-A'; 
  $scope.open = function(tab) {
    $scope.tab = tab;
  };
});

demoApp.controller('timeSubCtrl', function ($scope,$timeout,$interval) {
  var time;
  $scope.delayRun = function(){
    $scope.msg = "実行開始" + new Date().toLocaleTimeString() + "->";
    $timeout(function(){
      $scope.msg += "実行終了" + new Date().toLocaleTimeString();
    },5000);
  }
  $scope.intervalRun = function(){
    time = $interval(function () {
      $scope.time = new Date().toLocaleTimeString();
      console.log($scope.time);
    }, 2000);
  }
  var intervalStop = function() {
    if (angular.isDefined(time)) {
      $interval.cancel(time);
      time = undefined;
    }
  };
  $scope.$on('$destroy', function() {
    console.log("destroy");
    intervalStop();
  });
});

(7)$locationサービス

1)path、search、hash、urlの指定方法

  • Path:URLのパス(Searchパラメータとhashを除いた部分)を指定
  • Search:クエリパラメータ(?名前1=値1&名前2=値2)を指定
  • Hash:ハッシュ"#value"を指定
  • URL:Path、Search、Hashを含めて指定

URL:{{url}}

2)$anchorScrollを使ってページ内スクロール

  • {{item.title}}


1)path、search、hash、urlの指定方法<br />
<div ng-controller="locationCtrl">
  <ul>
    <li>Path:URLのパス(Searchパラメータとhashを除いた部分)を指定</li>
    <li>Search:クエリパラメータ(?名前1=値1&名前2=値2)を指定</li>
    <li>Hash:ハッシュ"#value"を指定</li>
    <li>URL:Path、Search、Hashを含めて指定</li>
  </ul>
  <div class="btn-group ">
    <button class="btn btn-primary" ng-click="setUrl('reset')">Reset</button><button class="btn btn-primary" ng-click="setUrl('path')">Path</button><button class="btn btn-primary" ng-click="setUrl('search')">Search</button><button class="btn btn-primary" ng-click="setUrl('hash')">Hash</button><button class="btn btn-primary" ng-click="setUrl('url')">URL</button>
  </div>
  <p>URL:{{url}}</p>
</div>

2)$anchorScrollを使ってページ内スクロール<br />
<div ng-controller="location2Ctrl">
  <input type="number" ng-model="showID" /><button class="btn btn-primary" ng-click="show(showID)">指定した記事へ</button>
  <ul>
    <li ng-repeat="item in items">
      <span id={{$index+1}} ng-class="{'bg-primary': item.focus}">{{item.title}}</span>
    </li>
  </ul>
  <button class="btn btn-primary" ng-click="show(1)">先頭の記事へ</a>
</div>

var demoApp = angular.module('demoApp', []);

demoApp.controller("locationCtrl", function ($scope, $location) {
  $scope.$on("$locationChangeSuccess", function (event) {
     $scope.url = $location.url();
  });
  var pathID = 0;
  var hashID = 0;
  var searchID = 0;
  $scope.setUrl = function (component) {
    switch (component) {
      case "reset":
        $location.url("/#nglocation");
        pathID = 0;
        hashID = 0;
        searchID = 0;
        break;
      case "path":
        ++pathID;
        $location.path("/path_A" + pathID + "/path_B" + pathID );
        break;
      case "search":
        ++searchID;
        $location.search("search" + searchID, "value" + searchID);
        break;
      case "hash":
        ++hashID;
        $location.hash("hash" + hashID);
        break;
      case "url":
        ++pathID;
        ++searchID;
        ++hashID;
        $location.url("/path_A" + pathID + "/path_B" + pathID + "?search" + searchID + "=value" + searchID + "#hash" + hashID);
        break;
    }
  }
});

demoApp.controller("location2Ctrl", function ($scope, $location, $anchorScroll)
{
  $scope.items = [];
  for (var i = 0; i < 30; i++) {
    $scope.items[i] = {
      title: "記事 " + (i + 1),
      focus: false
    };
  }
  $scope.show = function(id) {
    $location.hash(id);
    for (var i = 0; i < $scope.items.length; i++) {
      $scope.items[i].focus = false;
    };
    $scope.items[id-1].focus = true;
  }
});

(8)$rootScopeを使ってコントローラ間でデータをやり取り

Controller-A






{{success}}

{{info}}

{{warning}}

{{danger}}

Controller-B






{{success}}

{{info}}

{{warning}}

{{danger}}


<div class="well" ng-controller="scopeCtrl">
  <h4>Controller-A</h4>
  <form>
    <label>タイプ</label>
    <select ng-model="type" ng-options="item for item in types"></select>
    <label>メッセージ</label>
    <input ng-model="msg"><br />
    <button class="btn btn-primary" ng-click="alert(type, msg)">Send Alert</button>
  </form>
  <div ng-if="success != null">
    <p class="bg-success">{{success}}</p>
  </div>
  <div ng-if="info != null">
    <p class="bg-info">{{info}}</p>
  </div>
  <div ng-if="warning != null">
    <p class="bg-warning">{{warning}}</p>
  </div>
  <div ng-if="danger != null">
    <p class="bg-danger">{{danger}}</p>
  </div>
</div>
<div class="well" ng-controller="scopeCtrl">
  <h4>Controller-B</h4>
  <form>
    <label>タイプ</label>
    <select ng-model="type" ng-options="item for item in types"></select>
    <label>メッセージ</label>
    <input ng-model="msg"><br />
    <button class="btn btn-primary" ng-click="alert(type, msg)">Send Alert</button>
  </form>
  <div ng-if="success != null">
    <p class="bg-success">{{success}}</p>
  </div>
  <div ng-if="info != null">
    <p class="bg-info">{{info}}</p>
  </div>
  <div ng-if="warning != null">
    <p class="bg-warning">{{warning}}</p>
  </div>
  <div ng-if="danger != null">
    <p class="bg-danger">{{danger}}</p>
  </div>
</div>

var demoApp = angular.module('demoApp', []);

demoApp.controller("scopeCtrl", function ($scope, $rootScope) {
  $scope.types = ['success','info','warning','danger'];
  $scope.$on("globalAlert", function (event, args) {
    $scope[args.type] = args.msg;
  });
  $scope.alert = function (type, msg) {
    $rootScope.$broadcast("globalAlert", {
      type: type, msg: msg
    });
  }
});


関連記事の目次

AngularJSコードサンプル

AngularJS : 1.6.5
Bootstrap : 3.3.7
 
※v1.2.3のサンプルはこちら
 
■目次
(1)データバインディング
(2)ng-repeatで表、リストを作成、フィルターを適用
(3)ng-includeを使って外部ファイルのHTMLを埋め込み
(4)ng-switchを使って内部HTMLの表示を切り替え
(5)ng-if、ng-show、ng-hideを使って表示、非表示を切り替え
(6)ng-class、ng-styleを使ってCSSを設定
(7)イベントを処理するディレクティブ
(8)有効、無効を切替えるディレクティブ
(9)フォームの入力チェックとCSS設定
(10)ng-optionsを使ってSelectメニューを作成
(10.1)ng-repeatを使ってラジオボタンを作成
(11)ビルトインのフィルターの使い方
(12)ビルトインのフィルターで関数を使用
(13)カスタムフィルター
(14)AngularJSとBootstrap3を使ってページング
(15)スクリプト内でフィルターを使用、既存のフィルターを拡張
 

(1)データバインディング

1)Wayデータバインディング

1)二重波括弧:私は{{country}}在住です。
2)ng-bind:私は在住です。
3)二重波括弧:私は{{country}}在住の{{gender}}です。
4)ng-bind-template:私は{{country}}在住の{{gender}}です。
二重波括弧{{…..}}を表示するには、ng-non-bindableを使用。

 
2)2Wayデータバインディング

私の名前は{{name}}です。

名前:

<strong>1)Wayデータバインディング</strong>
<div>1)二重波括弧:私は{{country}}在住です。</div>
<div>2)ng-bind:私は<span ng-bind="country"></span>在住です。</div>
<div>3)二重波括弧:私は{{country}}在住の{{gender}}です。</div>
<div>4)ng-bind-template:私は{{country}}在住の{{gender}}です。</div>
<div ng-non-bindable>二重波括弧{{....}}を表示するには、ng-non-bindableを使用。</div>
 
<strong>2)2Wayデータバインディング</strong>
<div>私の名前は{{name}}です。</div>
名前:<input ng-model="name" />
var demoApp = angular.module('demoApp', []);
demoApp.controller("bindingCtrl", function ($scope) {
  $scope.country = "日本";
  $scope.gender = "男性";
  $scope.name = "初期値";
});

(2)ng-repeatで表、リストを作成、フィルターを適用

1)ng-repeatを使って表を作成

名前 年齢
{{person.name}} {{person.age}}

2)ng-repeatのビルトイン変数を使用

No. 名前 年齢
{{$index + 1}} {{person.name}} {{person.age}}

3)ng-repeatを入力文字列でフィルター
 
フィルター:

  • {{person.name}} ({{person.age}}) {{person.address}}
<strong>1)ng-repeatを使って表を作成</strong>
<table class="table">
  <thead>
    <tr><th>名前</th><th>年齢</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="person in people">
      <td>{{person.name}}</td>
      <td>{{person.age}}</td>
    </tr>
  </tbody>
</table>

<strong>2)ng-repeatのビルトイン変数を使用</strong>
<table class="table">
  <thead>
    <tr><th>No.</th><th>名前</th><th>年齢</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="person in people" ng-class="$odd ? 'bg-success' : 'bg-warning'">
      <td>{{$index + 1}}</td>
      <td>{{person.name}}</td>
      <td>{{person.age}}</td>
    </tr>
  </tbody>
</table>

<strong>3)ng-repeatを入力文字列でフィルター</strong>

フィルター:<input ng-model="query" type="text" placeholder="表示したい名前、住所、年齢を入力" autofocus>
<ul>
  <li ng-repeat="person in people | filter: query | orderBy: 'age' ">{{person.name}} ({{person.age}}) {{person.address}}</li>
</ul>
var demoApp = angular.module('demoApp', []);
demoApp.controller("repeatCtrl", function($scope) {
  $scope.people = [
    { name: "相田", age: 20 ,address: "東京都品川区"},
    { name: "伊藤", age: 55 ,address: "神奈川県横浜市"},
    { name: "上野", age: 20 ,address: "埼玉県川越市"},
    { name: "江藤", age: 37 ,address: "東京都世田谷区"},
    { name: "岡田", age: 20 ,address: "千葉県松戸市"},
    { name: "加藤", age: 32 ,address: "東京都府中市"}
  ];
});

(3)ng-includeを使って外部ファイルのHTMLを埋め込み

1)ng-includeを使って外部ファイルのHTMLを埋め込み

この下に外部HTMLファイルの内容を埋め込み

この上に外部HTMLファイルの内容を埋め込み

2)条件に応じて表示する外部HTMLを切り替え
 

リスト

<strong>1)ng-includeを使って外部ファイルのHTMLを埋め込み</strong>
<div class="well well-sm">この下に外部HTMLファイルの内容を埋め込み</div>
<ng-include src="'http://example.com/wp-content/themes/wp/template/include_table.html'"></ng-include>
<div class="well well-sm">この上に外部HTMLファイルの内容を埋め込み</div>

<strong>2)条件に応じて表示する外部HTMLを切り替え</strong>
 <br />
<form>
<input type="radio" ng-model="includeFile" value="list">リスト<input type="radio" ng-model="includeFile" value="table">表
</form>
<ng-include src="switchHtml()"></ng-include>
var demoApp = angular.module('demoApp', []);
demoApp.controller("includeCtrl", function($scope) {
  $scope.people = [
    { name: "相田", age: 20 ,address: "東京都品川区"},
    { name: "伊藤", age: 55 ,address: "神奈川県横浜市"},
    { name: "上野", age: 20 ,address: "埼玉県川越市"},
    { name: "江藤", age: 37 ,address: "東京都世田谷区"},
  ];

  var url = 'http://example.com/wp-content/themes/wp/template/';

  $scope.switchHtml = function () {
    if ($scope.includeFile == "list"){
      return url + "include_list.html";
    } else if ($scope.includeFile == "table"){
      return url + "include_table.html";
    }
  }
});

(include_list.html)
<ul>
  <li ng-repeat="person in people">{{person.name}} ({{person.age}}) {{person.address}}</li>
</ul>

(include_table.html)
<table class="table">
  <thead>
    <tr><th>名前</th><th>年齢</th><th>住所</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="person in people">
      <td>{{person.name}}</td>
      <td>{{person.age}}</td>
      <td>{{person.address}}</td>
    </tr>
  </tbody>
</table>

(4)ng-switchを使って内部HTMLの表示を切り替え


以下のサンプルでは、UI Bootstrapのバージョン2.5.0のアコーディオンの機能を利用しています。
http://angular-ui.github.io/bootstrap/

ng-switchを使って内部にあるHTMLの表示を切り替え
 

リストアコーディオン

 

名前 年齢 住所
{{person.name}} {{person.age}} {{person.address}}
  • {{person.name}} ({{person.age}}) {{person.address}}

  • 年齢:{{person.age}}
  • 住所:{{person.address}}

上のラジオボタンで選択したフォーマットでデータが表示されます。
<form>
<input type="radio" ng-model="switch" value="list">リスト<input type="radio" ng-model="switch" value="table">表<input type="radio" ng-model="switch" value="accordion">アコーディオン
</form>
<div ng-switch on="switch">
  <div ng-switch-when="table">
    <table class="table">
      <thead>
        <tr><th>名前</th><th>年齢</th><th>住所</th></tr>
      </thead>
      <tbody>
        <tr ng-repeat="person in people">
          <td>{{person.name}}</td>
          <td>{{person.age}}</td>
          <td>{{person.address}}</td>
        </tr>
      </tbody>
    </table>
  </div>
  <div ng-switch-when="list">
    <ul>
      <li ng-repeat="person in people">{{person.name}} ({{person.age}}) {{person.address}}</li>
    </ul>
  </div>
  <div ng-switch-when="accordion">
    <uib-accordion close-others=true>
      <div uib-accordion-group class="panel-default"
                               heading="{{person.name}}"
                               ng-repeat="person in people">
          <ul>
            <li>年齢:{{person.age}}</li>
            <li>住所:{{person.address}}</li>
          </ul>
      </div>
    </uib-accordion>
  </div>
  <div ng-switch-default>
    上のラジオボタンで選択したフォーマットでデータが表示されます。
  </div>
</div>
var demoApp = angular.module('demoApp', ['ui.bootstrap']);
demoApp.controller("includeCtrl", function($scope) {
  $scope.people = [
    { name: "相田", age: 20 ,address: "東京都品川区"},
    { name: "伊藤", age: 55 ,address: "神奈川県横浜市"},
    { name: "上野", age: 20 ,address: "埼玉県川越市"},
    { name: "江藤", age: 37 ,address: "東京都世田谷区"},
  ];
});

(5)ng-if、ng-show、ng-hideを使って表示、非表示を切り替え

1)ng-ifを使って表示、非表示を切り替え
 

  • {{person.name}}
    • 年齢:{{person.age}}
    • 住所:{{person.address}}

2)ng-showを使って表示、非表示を切り替え
 

  • {{person.name}}
    • 年齢:{{person.age}}
    • 住所:{{person.address}}
<strong>1)ng-ifを使って表示、非表示を切り替え</strong>
 
  <div class="checkbox">
    <label>
      <input type="checkbox" ng-model="detail" />詳細表示
    </label>
  </div>
  <ul>
    <li ng-repeat="person in people1">{{person.name}}
      <div ng-if="detail">
        <ul>
          <li>年齢:{{person.age}}</li>
          <li>住所:{{person.address}}</li>
        </ul>
      </div>
    </li>
  </ul>
<strong>2)ng-showを使って表示、非表示を切り替え</strong>
 
<style>
  .detail > *:first-child {font-weight: bold}
</style>
  <ul>
    <li ng-repeat="person in people1">{{person.name}}
      <ul class="detail">
        <li ng-show="person.age_v">年齢:{{person.age}}</li>
        <li ng-show="person.address_v">住所:{{person.address}}</li>
      </ul>
    </li>
  </ul>
var demoApp = angular.module('demoApp', []);
demoApp.controller("includeCtrl", function($scope) {
  $scope.people1 = [
    { name: "相田", age: 20, age_v: true, address: "東京都品川区",address_v: fal
se},
    { name: "伊藤", age: 55, age_v: false, address: "神奈川県横浜市",address_v:
true},
    { name: "上野", age: 20, age_v: true,address: "埼玉県川越市",address_v: true
},
    { name: "江藤", age: 37, age_v: false,address: "東京都世田谷区",address_v: f
alse},
  ];
});

(6)ng-class、ng-styleを使ってCSSを設定

1)ng-class、ng-styleを使ってCSSを設定
 

  • {{person.name}}
    • 年齢:{{person.age}}
    • 住所:{{person.address}}

 
2)ng-class-even、ng-class-oddを使ってng-repeatの表をストライピング
 

No. 名前 年齢
{{$index + 1}} {{person.name}} {{person.age}}
1)ng-class、ng-styleを使ってCSSを設定
  <div class="checkbox">
    <label>
      <input type="checkbox" ng-model="danger" />ng-classでCSS設定
    </label>
  </div>
  <ul ng-class="{'bg-warning': danger}">
    <li ng-repeat="person in people">{{person.name}}
      <ul>
        <li ng-style="{color:'red'}">年齢:{{person.age}}</li>
        <li ng-class="danger ? ['bg-success','text-danger']:['bg-danger','text-success']">住所:{{person.address}}</li>
      </ul>
    </li>
  </ul>
 
2)ng-class-even、ng-class-oddを使ってng-repeatの表をストライピング
 
<style>
  tr.tbl-bg-clr-odd { background-color: lightpink; }
  tr.tbl-bg-clr-even { background-color: lightgreen;}
</style>
<table class="table">
  <thead>
    <tr><th>No.</th><th>名前</th><th>年齢</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="person in people" ng-class-even="tblBgClr.even" ng-class-odd="tblBgClr.odd">
      <td>{{$index + 1}}</td>
      <td>{{person.name}}</td>
      <td>{{person.age}}</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("includeCtrl", function($scope) {
  $scope.people = [
    { name: "相田", age: 20 ,address: "東京都品川区"},
    { name: "伊藤", age: 55 ,address: "神奈川県横浜市"},
    { name: "上野", age: 20 ,address: "埼玉県川越市"},
    { name: "江藤", age: 37 ,address: "東京都世田谷区"},
  ];
  $scope.tblBgClr = {
    odd: "tbl-bg-clr-odd",
    even: "tbl-bg-clr-even"
  }
});

(7)イベントを処理するディレクティブ

マウスイベントを使ってボタンの色を変更
 

ボタンにマウスを合わせる、離す、クリックすると色が変わります。

 

  <p>ボタンにマウスを合わせる、離す、クリックすると色が変わります。</p>
  <button class="btn" ng-class="btnColor1"
          ng-click="btnColor1='btn-success'"
          ng-mouseenter="btnColor1='btn-primary'"
          ng-mouseleave="btnColor1='btn-defult'"
  >
    イベント処理1
  </button>
  <button class="btn" ng-class="btnColor2"
          ng-click="handleEvent($event)"
          ng-mouseenter="handleEvent($event)"
          ng-mouseleave="handleEvent($event)"
  >
    イベント処理2
  </button>

var demoApp = angular.module('demoApp', []);
demoApp.controller("includeCtrl", function($scope) {
  $scope.handleEvent = function (e) {
    console.log("イベントのタイプ: " + e.type);
    switch (e.type){
      case "mouseover":
        $scope.btnColor2 = "btn-primary";
        break;
      case "mouseenter":
        $scope.btnColor2 = "btn-primary";
        break;
      case "click":
        $scope.btnColor2 = "btn-success";
        break;
      default:
        $scope.btnColor2 = "btn-default";
        break;
    }
  }
});

(8)有効、無効を切替えるディレクティブ

有効、無効を切り替え
 
1)ng-disabled ボタンの有効無効を切り替え

2)ng-checked チェックボックスのチェックを切り替え
最上部チェック有効
3)ng-readonly 読込専用を切り替え

4)ng-selected 選択、未選択を切り替え


<input type="checkbox" ng-model="checkValue">有効、無効を切り替え
1)ng-disabled ボタンの有効無効を切り替え
  <button class="btn btn-success" ng-disabled="checkValue">ボタン</button><br />
2)ng-checked チェックボックスのチェックを切り替え
  <input type="checkbox" ng-checked="checkValue">最上部チェック有効<br />
3)ng-readonly 読込専用を切り替え
  <input type="text" ng-readonly="checkValue" value="最上部チェックで読込専用"/><br />
4)ng-selected 選択、未選択を切り替え
  <select>
    <option selected>選択肢1</option>
    <option>選択肢2</option>
    <option ng-selected="checkValue">最上部チェックで有効</option>
  </select>

(9)フォームの入力チェックとCSS設定

AngularJSのフォームで入力チェック、CSS設定



必須項目: 会員番号を入力してください。文字数: 5文字以上。文字数: 10文字以内。文字種: 半角英大文字アルファベットと数字。


必須項目: メールアドレスを入力しでください。メールフォーマットエラー: 正しいメールアドレスフォーマットを入力してください。

入力内容
{{master | json}}

<style>
  form.ng-invalid.ng-dirty { background-color: lightpink; }
  form.ng-valid.ng-dirty { background-color: lightgreen; }
  form { padding: 10px;}
</style>
<form name="appForm" novalidate>
  <div class="well">
    <div class="form-group" ng-class="{'has-error': appForm.name.$invalid && appForm.name.$dirty}">
      <label>会員番号(必須項目、半角英大文字or半角数字5~10文字)</label>
      <input type="text" name="name" class="form-control"
         ng-model="user.name" required
         ng-minlength="5" ng-maxlength="10"
         ng-pattern="/^[A-Z0-9]+$/" />
      <span class="text-danger" ng-show="appForm.name.$dirty && appForm.name.$error.required">必須項目: 会員番号を入力してください。</span>
      <span class="text-danger" ng-show="appForm.name.$dirty && appForm.name.$error.minlength">文字数: 5文字以上。</span>
      <span class="text-danger" ng-show="appForm.name.$dirty && appForm.name.$error.maxlength">文字数: 10文字以内。</span>
      <span class="text-danger" ng-show="appForm.name.$dirty && appForm.name.$error.pattern">文字種: 半角英大文字アルファベットと数字。</span>
    </div>

    <div class="form-group" ng-class="{'has-error': appForm.email.$invalid && appForm.email.$dirty}">
      <label>メールアドレス(必須項目、メールフォーマットチェック)</label>
      <input type="email" name="email" class="form-control"
        ng-model="user.email" required />
      <span class="text-danger" ng-show="appForm.email.$dirty && appForm.email.$error.required">必須項目: メールアドレスを入力しでください。</span>
      <span class="text-danger" ng-show="appForm.email.$dirty && appForm.email.$error.email">メールフォーマットエラー: 正しいメールアドレスフォーマットを入力してください。</span>
    </div>
    <div class="text-center">
      <button ng-disabled="appForm.$invalid" ng-click="save()" class="btn btn-primary">登録
      </button>
    </div>
  </div>
</form>
<div class="well" ng-show="master">
  <strong>入力内容</strong><br />
  {{master | json}}
</div>
var demoApp = angular.module('demoApp', []);
demoApp.controller("formCtrl", function($scope) {
  $scope.user = null;
  $scope.master = null;
  $scope.save = function(){
    $scope.master = angular.copy($scope.user);
  }
});

(10)ng-optionsを使ってSelectメニューを作成

1)オブジェクト全体を値として取得
 

選択した値: {{selectCity1}}

2)オブジェクト内の指定した属性を取得

選択した値: {{selectCity2}}

3)グループ化してオプションを表示

選択した値: {{selectCity3}}


1)オブジェクト全体を値として取得
 
<select ng-model="selectCity1" ng-options="city.name for city in citys">
  <option value="">市区町村を選択してください</option>
</select>

  選択した値: {{selectCity1}}

2)オブジェクト内の指定した属性を取得
<select ng-model="selectCity2" ng-options="city.id as city.name for city in citys">
  <option value="">市区町村を選択してください</option>
</select>

  選択した値: {{selectCity2}}

3)グループ化してオプションを表示
<select ng-model="selectCity3" ng-options="city.id as city.name group by city.pref for city in citys">
  <option value="">市区町村を選択してください</option>
</select>

  選択した値: {{selectCity3}}

var demoApp = angular.module('demoApp', []);
demoApp.controller("formCtrl", function($scope) {
  $scope.citys = [
    { id: "0101", name: "港区", pref: "東京都"},
    { id: "0102", name: "渋谷区", pref: "東京都"},
    { id: "0103", name: "新宿区", pref: "東京都"},
    { id: "0201", name: "横浜市", pref: "神奈川県"},
    { id: "0202", name: "川崎市", pref: "神奈川県"}
  ];
});

(10.1)ng-repeatを使ってラジオボタンを作成

1)$parent属性を使用する方法
 

選択した値: {{selectedPref}}
 
2)ラジオボタンのng-change属性の使用例
 

選択した値: {{data.selectedPref}}

  • {{item}}

1)$parent属性を使用する方法
 <br />
  <div class="radio" ng-repeat="item in prefs">
    <label>
      <input type="radio" ng-model="$parent.selectedPref"
           value="{{item.id}}">{{item.name}}
    </label>
  </div>
  選択した値: {{selectedPref}}<br />
2)ラジオボタンのng-change属性の使用例<br />
 <br />
  <div class="radio" ng-repeat="item in prefs">
    <label>
      <input type="radio" ng-model="data.selectedPref"
           value="{{item.id}}"
           ng-change="data.changePref($index)">{{item.name}}
    </label>
  </div>
  選択した値: {{data.selectedPref}}
  <ul>
    <li ng-repeat="item in data.pref">{{item}}</li>
  </ul>

var demoApp = angular.module('demoApp', []);
demoApp.controller("formCtrl", function($scope) {
  $scope.prefs = [
    { id: "01", name: "東京都"},
    { id: "02", name: "神奈川県"}
  ];
  var prefsDetail = [
    { id: "01", 
      name: "東京都",
      kencho: "新宿区", 
      jinko: "・・・・"},
    { id: "02", 
      name: "神奈川県",
      kencho: "横浜市", 
      jinko: "・・・・"}
  ];
  $scope.selectedPref="01";

  $scope.data = {};
  $scope.data.selectedPref="01";
  $scope.data.pref=prefsDetail[0];
  $scope.data.changePref = function(index) {
    $scope.data.pref=prefsDetail[index];
  };
})

(11)ビルトインのフィルターの使い方

1)降順のorderBy、limitToで表示個数、numberで小数点桁数
 

日時 国語 算数 理科 平均
{{myScore.day}} {{myScore.jpn}} {{myScore.math}} {{myScore.sci}} {{(myScore.jpn + myScore.math + myScore.sci)/3 | number:1}}

2)複数項目でorderBy、属性の値でfilter
 
フィルター:

商品名 分類 価格
{{item.name}} {{item.grp}} {{item.price | number:0}}円


1)降順のorderBy、limitToで表示個数、numberで小数点桁数
 
<table class="table">
  <thead>
    <tr><th>日時</th><th>国語</th><th>算数</th><th>理科</th><th>平均</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="myScore in myScores | orderBy: '-day' |limitTo:3">
      <td>{{myScore.day}}</td>
      <td>{{myScore.jpn}}</td>
      <td>{{myScore.math}}</td>
      <td>{{myScore.sci}}</td>
      <td>{{(myScore.jpn + myScore.math + myScore.sci)/3 | number:1}}</td>
    </tr>
  </tbody>
</table>
  
2)複数項目でorderBy、属性の値でfilter
  フィルター:<input ng-model="query" type="text" placeholder="商品名で検索" autofocus> <table class="table"> <thead> <tr><th>商品名</th><th>分類</th><th>価格</th></tr> </thead> <tbody> <tr ng-repeat="item in products |filter:{chk: 'true',name: query} | orderBy:['grp','price']"> <td>{{item.name}}</td> <td>{{item.grp}}</td> <td>{{item.price | number:0}}円</td> </tr> </tbody> </table>
var demoApp = angular.module('demoApp', []);
demoApp.controller("filterCtrl", function($scope) {
  $scope.myScores = [
    { day: "2014/01/08", jpn: 74 ,math: 52, sci: 68 },
    { day: "2014/03/08", jpn: 54 ,math: 63, sci: 38 },
    { day: "2014/04/08", jpn: 36 ,math: 91, sci: 78 },
    { day: "2014/02/08", jpn: 74 ,math: 52, sci: 48 },
    { day: "2014/11/08", jpn: 48 ,math: 57, sci: 28 },
    { day: "2014/06/08", jpn: 94 ,math: 52, sci: 78 }
  ];
  $scope.products = [
    {name: "デジタルカメラA",grp:"カメラ",price: 8500,chk:true},
    {name: "デジタルカメラD",grp:"カメラ",price: 3500,chk:false},
    {name: "パソコンB",grp:"パソコン",price: 15900,chk:true},
    {name: "デジタルカメラB",grp:"カメラ",price: 9800,chk:true},
    {name: "パソコンD",grp:"パソコン",price: 5900,chk:false},
    {name: "パソコンC",grp:"パソコン",price: 25900,chk:true},
    {name: "パソコンA",grp:"パソコン",price: 14900,chk:true}
  ];
});

(12)ビルトインのフィルターで関数を使用

1)filterで関数を使用
 

日時 国語 算数 理科 平均
{{myScore.day}} {{myScore.jpn}} {{myScore.math}} {{myScore.sci}} {{myScore.jpn + myScore.math + myScore.sci}}

2)orderByで式を指定して、項目クリックでソート
 
[ 初期状態に戻す ]

日時 国語 算数 理科 合計
{{myScore.day}} {{myScore.jpn}} {{myScore.math}} {{myScore.sci}} {{myScore.jpn + myScore.math + myScore.sci}}

3)orderByで関数を使用
 

商品名 価格 在庫数
{{item.name}} {{item.price | number:0}}円 {{item.stock}}

1)filterで関数を使用
 
<table class="table">
  <thead>
    <tr><th>日時</th><th>国語</th><th>算数</th><th>理科</th><th>合計</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="myScore in myScores | filter:selectPass">
      <td>{{myScore.day}}</td>
      <td>{{myScore.jpn}}</td>
      <td>{{myScore.math}}</td>
      <td>{{myScore.sci}}</td>
      <td>{{myScore.jpn + myScore.math + myScore.sci}}</td>
    </tr>
  </tbody>
</table>
  <br />
2)orderByで式を指定して、項目クリックでソート<br />
 
[ <a href="" ng-click="sortClm=''">初期状態に戻す</a> ]
<table class="table">
  <thead>
    <tr>
      <th><a href="" ng-click="sortClm = 'day'; reverse=!reverse">日時</a></th>
      <th><a href="" ng-click="sortClm = 'jpn'; reverse=!reverse">国語</a></th>
      <th><a href="" ng-click="sortClm = 'math'; reverse=!reverse">算数</a></th>
      <th><a href="" ng-click="sortClm = 'sci'; reverse=!reverse">理科</a></th>
      <th>合計</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="myScore in myScores | orderBy:sortClm:reverse">
      <td>{{myScore.day}}</td>
      <td>{{myScore.jpn}}</td>
      <td>{{myScore.math}}</td>
      <td>{{myScore.sci}}</td>
      <td>{{myScore.jpn + myScore.math + myScore.sci}}</td>
    </tr>
  </tbody>
</table>
  <br />
3)orderByで関数を使用<br />
 
<table class="table">
  <thead>
    <tr><th>商品名</th><th>価格</th><th>在庫数</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products | orderBy:customOrder">
      <td>{{item.name}}</td>
      <td>{{item.price | number:0}}円</td>
      <td>{{item.stock}}</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("filterCtrl", function($scope) {
  $scope.myScores = [
    { day: "2014/01/08", jpn: 74 ,math: 52, sci: 68 },
    { day: "2014/03/08", jpn: 54 ,math: 63, sci: 38 },
    { day: "2014/04/08", jpn: 36 ,math: 91, sci: 78 },
    { day: "2014/02/08", jpn: 74 ,math: 52, sci: 48 },
    { day: "2014/11/08", jpn: 48 ,math: 57, sci: 28 },
    { day: "2014/06/08", jpn: 94 ,math: 52, sci: 78 }
  ];
  $scope.products = [
    {name: "デジタルカメラA",price: 8500,stock:3},
    {name: "デジタルカメラD",price: 3500,stock:0},
    {name: "パソコンB",price: 15900,stock:6},
    {name: "デジタルカメラB",price: 9800,stock:3},
    {name: "パソコンD",price: 5900,stock:0},
    {name: "パソコンC",price: 25900,stock:1},
    {name: "パソコンA",price: 14900,stock:10}
  ];
  $scope.selectPass = function (item) {
    if ((item.jpn + item.math + item.sci) > 180 ) {
      return item;
    }
  };
  $scope.customOrder = function (item) {
    return item.stock == 0 ? 99999 : item.price;
  };
})

(13)カスタムフィルター

1)単一の属性値を変換するカスタムフィルター
 

予定 チェック
{{item.action}} {{item.chk | checkmark}}

2)配列データをフィルタリングするカスタムフィルター
 

商品名 分類 価格
{{item.name}} {{item.grp}} {{item.price | number:0}}円

1)単一の属性値を変換するカスタムフィルター
 
<table class="table">
  <thead>
    <tr><th>予定</th><th>チェック</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in todos">
      <td>{{item.action}}</td>
      <td>{{item.chk | checkmark}}</td>
    </tr>
  </tbody>
</table>
  <br />
2)配列データをフィルタリングするカスタムフィルター<br />
 
<select ng-model="selectGrp" ng-options="item.grp as item.grp for item in products | distinct:'grp'">
  <option value="">商品分類を選択してください</option>
</select>
<table class="table">
  <thead>
    <tr><th>商品名</th><th>分類</th><th>価格</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products |filter:{grp: selectGrp}">
      <td>{{item.name}}</td>
      <td>{{item.grp}}</td>
      <td>{{item.price | number:0}}円</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("filterCtrl", function($scope) {
  $scope.products = [
    {name: "デジタルカメラA",grp:"カメラ",price: 8500},
    {name: "デジタルカメラD",grp:"カメラ",price: 3500},
    {name: "パソコンB",grp:"パソコン",price: 15900},
    {name: "デジタルカメラB",grp:"カメラ",price: 9800},
    {name: "パソコンD",grp:"パソコン",price: 5900},
    {name: "テレビC",grp:"テレビ",price: 25900},
    {name: "パソコンA",grp:"パソコン",price: 14900}
  ];

  $scope.todos = [
    {action: "データベースのバックアップ",chk:true},
    {action: "AngularJSの勉強",chk:false},
    {action: "ログの確認",chk:true},
    {action: "JavaScriptの勉強",chk:false},
    {action: "レポートを作成",chk:true},
  ];
})
demoApp.filter('checkmark', function() {
  return function(input) {
    return input ? '\u2713' : '';
  };
})

demoApp.filter("distinct", function () {
  return function (data, keyName) {
    var results = [];
    var keys = {};
    for (var i = 0; i < data.length; i++) {
      var val = data[i][keyName];
      if (!keys[val]) {
        keys[val] = true;
        results.push(data[i]);
      }
    }
    return results;
  }
});

(14)AngularJSとBootstrap3を使ってページング

ステップ1)配列データをオフセットと表示個数を指定して表示
 

:
名前 年齢 住所
{{item.id}} {{item.name}} {{item.age}} {{item.address}}

ステップ2)配列データをページングで表示
 

名前 年齢 住所
{{item.id}} {{item.name}} {{item.age}} {{item.address}}

ステップ3)ページリンクのCSS設定
 

名前 年齢 住所
{{item.id}} {{item.name}} {{item.age}} {{item.address}}

ステップ1)配列データをオフセットと表示個数を指定して表示
 
<form class="form-inline">
  <input ng-model="i_offset" type="text" placeholder="オフセット">
  <input ng-model="i_size" type="text" placeholder="表示個数">
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <th>№</th><th>名前</th><th>年齢</th><th>住所</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends | offset: i_offset | limitTo: i_size">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.age}}</td>
      <td>{{item.address}}</td>
    </tr>
  </tbody>
</table>
  <br />
ステップ2)配列データをページングで表示<br />
 
<form class="form-inline">
  <div class="form-group">
    <label>1ページの件数:</label>
    <input ng-model="itemsPerPage" type="text">
  </div>
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <th>№</th><th>名前</th><th>年齢</th><th>住所</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends | offset: (currentPage-1)*itemsPerPage | limitTo: itemsPerPage">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.age}}</td>
      <td>{{item.address}}</td>
    </tr>
  </tbody>
  <tfoot>
    <td colspan="4">
      <ul class="pagination">
        <li>
          <a href="#" ng-click="prevPage()">≪ 前へ</a>
        </li>
        <li ng-repeat="n in range()" ng-click="setPage(n)">
          <a href="#">{{n}}</a>
        </li>
        <li>
          <a href="#" ng-click="nextPage()">次へ ≫</a>
        </li>
      </ul>
    </td>
  </tfoot>
</table>
  <br />
ステップ3)ページリンクのCSS設定<br />
 
<form class="form-inline">
  <div class="form-group">
    <label>1ページの件数:</label>
    <input ng-model="itemsPerPage" type="text">
  </div>
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <th>№</th><th>名前</th><th>年齢</th><th>住所</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends | offset: (currentPage-1)*itemsPerPage | limitTo: itemsPerPage">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.age}}</td>
      <td>{{item.address}}</td>
    </tr>
  </tbody>
  <tfoot>
    <td colspan="4">
      <ul class="pagination">
        <li ng-class="prevPageDisabled()">
          <a href="#" ng-click="prevPage()">≪ 前へ</a>
        </li>
        <li ng-repeat="n in range()"  ng-class="{active: n == currentPage}" ng-click="setPage(n)">
          <a href="#">{{n}}</a>
        </li>
        <li ng-class="nextPageDisabled()">
          <a href="#" ng-click="nextPage()">次へ ≫</a>
        </li>
      </ul>
    </td>
  </tfoot>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("pagingCtrl", function($scope) {
  $scope.itemsPerPage = 3;
  $scope.currentPage = 1;
  $scope.friends = [
    { id: 1, name: "相田",   age: 20 ,address: "東京都品川区"},
    { id: 2, name: "伊藤",   age: 55 ,address: "神奈川県横浜市"},
    { id: 3, name: "上野",   age: 20 ,address: "埼玉県川越市"},
       :
  ];
  $scope.range = function() {
    $scope.maxPage = Math.ceil($scope.friends.length/$scope.itemsPerPage);
    var ret = [];
    for (var i=1; i<=$scope.maxPage; i++) {
      ret.push(i);
    }
    return ret;
  };
  $scope.setPage = function(n) {
    $scope.currentPage = n;
  };
  $scope.prevPage = function() {
    if ($scope.currentPage > 1) {
      $scope.currentPage--;
    }
  };
  $scope.nextPage = function() {
    if ($scope.currentPage < maxPage) {
      $scope.currentPage++;
    }
  };
  $scope.prevPageDisabled = function() {
    return $scope.currentPage === 1 ? "disabled" : "";
  };

  $scope.nextPageDisabled = function() {
    return $scope.currentPage === $scope.maxPage ? "disabled" : "";
  };
})
demoApp.filter('offset', function() {
  return function(input, start) {
    start = parseInt(start);
    return input.slice(start);
  };
})

(15)スクリプト内でフィルターを使用、既存のフィルターを拡張

1)コントローラ内でフィルターを使用

①filterFilterの書式を使用
 

商品番号 商品名 価格
{{item.no}} {{item.name}} {{item.price | number:0}}円

②$filterを使用
 

商品番号 商品名 価格
{{item.no}} {{item.name}} {{item.price | number:0}}円

2)既存のフィルターを拡張
 



商品番号 商品名 価格
{{item.no}} {{item.name}} {{item.price | number:0}}円

1)コントローラ内でフィルターを使用<br />
<br />
①filterFilterの書式を使用<br />
 
<table class="table">
  <thead>
    <tr><th>商品番号</th><th>商品名</th><th>価格</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in trueProducts">
      <td>{{item.no}}</td>
      <td>{{item.name}}</td>
      <td>{{item.price | number:0}}円</td>
    </tr>
  </tbody>
</table><br />
②$filterを使用<br />
 
<table class="table">
  <thead>
    <tr><th>商品番号</th><th>商品名</th><th>価格</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in pcProducts">
      <td>{{item.no}}</td>
      <td>{{item.name}}</td>
      <td>{{item.price | number:0}}円</td>
    </tr>
  </tbody>
</table>
  <br />
2)既存のフィルターを拡張<br />
 
<form class="form-inline">
  <input ng-model="i_offset" type="text" placeholder="オフセット">
  <input ng-model="i_size" type="text" placeholder="表示個数">
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <tr><th>商品番号</th><th>商品名</th><th>価格</th></tr>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products | range:i_offset:i_size">
      <td>{{item.no}}</td>
      <td>{{item.name}}</td>
      <td>{{item.price | number:0}}円</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("filterCtrl", function($scope,filterFilter,$filter) {
  $scope.products = [
    {no: 1,name: "デジタルカメラA",price: 8500,chk:true},
    {no: 2,name: "デジタルカメラD",price: 3500,chk:false},
    {no: 3,name: "パソコンB",price: 15900,chk:true},
    {no: 4,name: "デジタルカメラB",price: 9800,chk:true},
    {no: 5,name: "パソコンD",price: 5900,chk:false},
    {no: 6,name: "パソコンC",price: 25900,chk:true},
    {no: 7,name: "パソコンA",price: 14900,chk:true}
  ];

  $scope.trueProducts = filterFilter($scope.products, {chk: 'true'});
  $scope.pcProducts = $filter("filter")($scope.products, {name: 'パソコン'});
})

demoApp.filter('offset', function() {
  return function(input, start) {
    start = parseInt(start);
    return input.slice(start);
  };
})

demoApp.filter('range', function($filter) {
  return function (input, offset, count) {
    var offsetInput = $filter("offset")(input, offset);
    return $filter("limitTo")(offsetInput, count);
  }
})

関連記事の目次

AngularJSコードサンプル(v1.2.23)

AngularJS : 1.2.23
Bootstrap : 3.x
 
■目次
(1)データバインディング
(2)ng-repeatで表、リストを作成、フィルターを適用
(3)ng-includeを使って外部ファイルのHTMLを埋め込み
(4)ng-switchを使って内部HTMLの表示を切り替え
(5)ng-if、ng-show、ng-hideを使って表示、非表示を切り替え
(6)ng-class、ng-styleを使ってCSSを設定
(7)イベントを処理するディレクティブ
(8)有効、無効を切替えるディレクティブ
(9)フォームの入力チェックとCSS設定
(10)ng-optionsを使ってSelectメニューを作成
(10.1)ng-repeatを使ってラジオボタンを作成
(11)ビルトインのフィルターの使い方
(12)ビルトインのフィルターで関数を使用
(13)カスタムフィルター
(14)AngularJSとBootstrap3を使ってページング
(15)スクリプト内でフィルターを使用、既存のフィルターを拡張
 

(1)データバインディング

1)Wayデータバインディング

1)二重波括弧:私は{{country}}在住です。
2)ng-bind:私は在住です。
3)二重波括弧:私は{{country}}在住の{{gender}}です。
4)ng-bind-template:私は{{country}}在住の{{gender}}です。
二重波括弧{{…..}}を表示するには、ng-non-bindableを使用。

 
2)2Wayデータバインディング

私の名前は{{name}}です。

名前:

<strong>1)Wayデータバインディング</strong>
<div>1)二重波括弧:私は{{country}}在住です。</div>
<div>2)ng-bind:私は<span ng-bind="country"></span>在住です。</div>
<div>3)二重波括弧:私は{{country}}在住の{{gender}}です。</div>
<div>4)ng-bind-template:私は{{country}}在住の{{gender}}です。</div>
<div ng-non-bindable>二重波括弧{{....}}を表示するには、ng-non-bindableを使用。</div>
 
<strong>2)2Wayデータバインディング</strong>
<div>私の名前は{{name}}です。</div>
名前:<input ng-model="name" />
var demoApp = angular.module('demoApp', []);
demoApp.controller("bindingCtrl", function ($scope) {
  $scope.country = "日本";
  $scope.gender = "男性";
  $scope.name = "初期値";
});

(2)ng-repeatで表、リストを作成、フィルターを適用

1)ng-repeatを使って表を作成

名前 年齢
{{person.name}} {{person.age}}

2)ng-repeatのビルトイン変数を使用

No. 名前 年齢
{{$index + 1}} {{person.name}} {{person.age}}

3)ng-repeatを入力文字列でフィルター
 
フィルター:

  • {{person.name}} ({{person.age}}) {{person.address}}
<strong>1)ng-repeatを使って表を作成</strong>
<table class="table">
  <thead>
    <tr><th>名前</th><th>年齢</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="person in people">
      <td>{{person.name}}</td>
      <td>{{person.age}}</td>
    </tr>
  </tbody>
</table>

<strong>2)ng-repeatのビルトイン変数を使用</strong>
<table class="table">
  <thead>
    <tr><th>No.</th><th>名前</th><th>年齢</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="person in people" ng-class="$odd ? 'bg-success' : 'bg-warning'">
      <td>{{$index + 1}}</td>
      <td>{{person.name}}</td>
      <td>{{person.age}}</td>
    </tr>
  </tbody>
</table>

<strong>3)ng-repeatを入力文字列でフィルター</strong>

フィルター:<input ng-model="query" type="text" placeholder="表示したい名前、住所、年齢を入力" autofocus>
<ul>
  <li ng-repeat="person in people | filter: query | orderBy: 'age' ">{{person.name}} ({{person.age}}) {{person.address}}</li>
</ul>
var demoApp = angular.module('demoApp', []);
demoApp.controller("repeatCtrl", function($scope) {
  $scope.people = [
    { name: "相田", age: 20 ,address: "東京都品川区"},
    { name: "伊藤", age: 55 ,address: "神奈川県横浜市"},
    { name: "上野", age: 20 ,address: "埼玉県川越市"},
    { name: "江藤", age: 37 ,address: "東京都世田谷区"},
    { name: "岡田", age: 20 ,address: "千葉県松戸市"},
    { name: "加藤", age: 32 ,address: "東京都府中市"}
  ];
});

(3)ng-includeを使って外部ファイルのHTMLを埋め込み

1)ng-includeを使って外部ファイルのHTMLを埋め込み

この下に外部HTMLファイルの内容を埋め込み

この上に外部HTMLファイルの内容を埋め込み

2)条件に応じて表示する外部HTMLを切り替え
 

リスト

<strong>1)ng-includeを使って外部ファイルのHTMLを埋め込み</strong>
<div class="well well-sm">この下に外部HTMLファイルの内容を埋め込み</div>
<ng-include src="'http://example.com/wp-content/themes/wp/template/include_table.html'"></ng-include>
<div class="well well-sm">この上に外部HTMLファイルの内容を埋め込み</div>

<strong>2)条件に応じて表示する外部HTMLを切り替え</strong>
 <br />
<form>
<input type="radio" ng-model="includeFile" value="list">リスト<input type="radio" ng-model="includeFile" value="table">表
</form>
<ng-include src="switchHtml()"></ng-include>
var demoApp = angular.module('demoApp', []);
demoApp.controller("includeCtrl", function($scope) {
  $scope.people = [
    { name: "相田", age: 20 ,address: "東京都品川区"},
    { name: "伊藤", age: 55 ,address: "神奈川県横浜市"},
    { name: "上野", age: 20 ,address: "埼玉県川越市"},
    { name: "江藤", age: 37 ,address: "東京都世田谷区"},
  ];

  var url = 'http://example.com/wp-content/themes/wp/template/';

  $scope.switchHtml = function () {
    if ($scope.includeFile == "list"){
      return url + "include_list.html";
    } else if ($scope.includeFile == "table"){
      return url + "include_table.html";
    }
  }
});

(include_list.html)
<ul>
  <li ng-repeat="person in people">{{person.name}} ({{person.age}}) {{person.address}}</li>
</ul>

(include_table.html)
<table class="table">
  <thead>
    <tr><th>名前</th><th>年齢</th><th>住所</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="person in people">
      <td>{{person.name}}</td>
      <td>{{person.age}}</td>
      <td>{{person.address}}</td>
    </tr>
  </tbody>
</table>

(4)ng-switchを使って内部HTMLの表示を切り替え


以下のサンプルでは、UI Bootstrapのバージョン0.11.0のアコーディオンの機能を利用しています。
https://github.com/angular-ui/bootstrap/tree/0.11.0

ng-switchを使って内部にあるHTMLの表示を切り替え
 

リストアコーディオン

 

名前 年齢 住所
{{person.name}} {{person.age}} {{person.address}}
  • {{person.name}} ({{person.age}}) {{person.address}}

  • 年齢:{{person.age}}
  • 住所:{{person.address}}

上のラジオボタンで選択したフォーマットでデータが表示されます。
<form>
<input type="radio" ng-model="switch" value="list">リスト<input type="radio" ng-model="switch" value="table">表<input type="radio" ng-model="switch" value="accordion">アコーディオン
</form>
<div ng-switch on="switch">
  <div ng-switch-when="table">
    <table class="table">
      <thead>
        <tr><th>名前</th><th>年齢</th><th>住所</th></tr>
      </thead>
      <tbody>
        <tr ng-repeat="person in people">
          <td>{{person.name}}</td>
          <td>{{person.age}}</td>
          <td>{{person.address}}</td>
        </tr>
      </tbody>
    </table>
  </div>
  <div ng-switch-when="list">
    <ul>
      <li ng-repeat="person in people">{{person.name}} ({{person.age}}) {{person.address}}</li>
    </ul>
  </div>
  <div ng-switch-when="accordion">
    <accordion>
      <div ng-repeat="person in people">
        <accordion-group heading={{person.name}}>
          <ul>
            <li>年齢:{{person.age}}</li>
            <li>住所:{{person.address}}</li>
          </ul>
        </accordion-group>
      </div>
    </accordion>
  </div>
  <div ng-switch-default>
    上のラジオボタンで選択したフォーマットでデータが表示されます。
  </div>
</div>
var demoApp = angular.module('demoApp', ['ui.bootstrap']);
demoApp.controller("includeCtrl", function($scope) {
  $scope.people = [
    { name: "相田", age: 20 ,address: "東京都品川区"},
    { name: "伊藤", age: 55 ,address: "神奈川県横浜市"},
    { name: "上野", age: 20 ,address: "埼玉県川越市"},
    { name: "江藤", age: 37 ,address: "東京都世田谷区"},
  ];
});

(5)ng-if、ng-show、ng-hideを使って表示、非表示を切り替え

1)ng-ifを使って表示、非表示を切り替え
 

  • {{person.name}}
    • 年齢:{{person.age}}
    • 住所:{{person.address}}

2)ng-showを使って表示、非表示を切り替え
 

  • {{person.name}}
    • 年齢:{{person.age}}
    • 住所:{{person.address}}
<strong>1)ng-ifを使って表示、非表示を切り替え</strong>
 
  <div class="checkbox">
    <label>
      <input type="checkbox" ng-model="detail" />詳細表示
    </label>
  </div>
  <ul>
    <li ng-repeat="person in people1">{{person.name}}
      <div ng-if="detail">
        <ul>
          <li>年齢:{{person.age}}</li>
          <li>住所:{{person.address}}</li>
        </ul>
      </div>
    </li>
  </ul>
<strong>2)ng-showを使って表示、非表示を切り替え</strong>
 
<style>
  .detail > *:first-child {font-weight: bold}
</style>
  <ul>
    <li ng-repeat="person in people1">{{person.name}}
      <ul class="detail">
        <li ng-show="person.age_v">年齢:{{person.age}}</li>
        <li ng-show="person.address_v">住所:{{person.address}}</li>
      </ul>
    </li>
  </ul>
var demoApp = angular.module('demoApp', []);
demoApp.controller("includeCtrl", function($scope) {
  $scope.people1 = [
    { name: "相田", age: 20, age_v: true, address: "東京都品川区",address_v: fal
se},
    { name: "伊藤", age: 55, age_v: false, address: "神奈川県横浜市",address_v:
true},
    { name: "上野", age: 20, age_v: true,address: "埼玉県川越市",address_v: true
},
    { name: "江藤", age: 37, age_v: false,address: "東京都世田谷区",address_v: f
alse},
  ];
});

(6)ng-class、ng-styleを使ってCSSを設定

1)ng-class、ng-styleを使ってCSSを設定
 

  • {{person.name}}
    • 年齢:{{person.age}}
    • 住所:{{person.address}}

 
2)ng-class-even、ng-class-oddを使ってng-repeatの表をストライピング
 

No. 名前 年齢
{{$index + 1}} {{person.name}} {{person.age}}
1)ng-class、ng-styleを使ってCSSを設定
  <div class="checkbox">
    <label>
      <input type="checkbox" ng-model="danger" />ng-classでCSS設定
    </label>
  </div>
  <ul ng-class="{'bg-warning': danger}">
    <li ng-repeat="person in people">{{person.name}}
      <ul>
        <li ng-style="{color:'red'}">年齢:{{person.age}}</li>
        <li ng-class="danger ? ['bg-success','text-danger']:['bg-danger','text-success']">住所:{{person.address}}</li>
      </ul>
    </li>
  </ul>
 
2)ng-class-even、ng-class-oddを使ってng-repeatの表をストライピング
 
<style>
  tr.tbl-bg-clr-odd { background-color: lightpink; }
  tr.tbl-bg-clr-even { background-color: lightgreen;}
</style>
<table class="table">
  <thead>
    <tr><th>No.</th><th>名前</th><th>年齢</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="person in people" ng-class-even="tblBgClr.even" ng-class-odd="tblBgClr.odd">
      <td>{{$index + 1}}</td>
      <td>{{person.name}}</td>
      <td>{{person.age}}</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("includeCtrl", function($scope) {
  $scope.people = [
    { name: "相田", age: 20 ,address: "東京都品川区"},
    { name: "伊藤", age: 55 ,address: "神奈川県横浜市"},
    { name: "上野", age: 20 ,address: "埼玉県川越市"},
    { name: "江藤", age: 37 ,address: "東京都世田谷区"},
  ];
  $scope.tblBgClr = {
    odd: "tbl-bg-clr-odd",
    even: "tbl-bg-clr-even"
  }
});

(7)イベントを処理するディレクティブ

マウスイベントを使ってボタンの色を変更
 

ボタンにマウスを合わせる、離す、クリックすると色が変わります。

 

  <p>ボタンにマウスを合わせる、離す、クリックすると色が変わります。</p>
  <button class="btn" ng-class="btnColor1"
          ng-click="btnColor1='btn-success'"
          ng-mouseenter="btnColor1='btn-primary'"
          ng-mouseleave="btnColor1='btn-defult'"
  >
    イベント処理1
  </button>
  <button class="btn" ng-class="btnColor2"
          ng-click="handleEvent($event)"
          ng-mouseenter="handleEvent($event)"
          ng-mouseleave="handleEvent($event)"
  >
    イベント処理2
  </button>

var demoApp = angular.module('demoApp', []);
demoApp.controller("includeCtrl", function($scope) {
  $scope.handleEvent = function (e) {
    console.log("イベントのタイプ: " + e.type);
    switch (e.type){
      case "mouseover":
        $scope.btnColor2 = "btn-primary";
        break;
      case "mouseenter":
        $scope.btnColor2 = "btn-primary";
        break;
      case "click":
        $scope.btnColor2 = "btn-success";
        break;
      default:
        $scope.btnColor2 = "btn-default";
        break;
    }
  }
});

(8)有効、無効を切替えるディレクティブ

有効、無効を切り替え
 
1)ng-disabled ボタンの有効無効を切り替え

2)ng-checked チェックボックスのチェックを切り替え
最上部チェック有効
3)ng-readonly 読込専用を切り替え

4)ng-selected 選択、未選択を切り替え


<input type="checkbox" ng-model="checkValue">有効、無効を切り替え
1)ng-disabled ボタンの有効無効を切り替え
  <button class="btn btn-success" ng-disabled="checkValue">ボタン</button><br />
2)ng-checked チェックボックスのチェックを切り替え
  <input type="checkbox" ng-checked="checkValue">最上部チェック有効<br />
3)ng-readonly 読込専用を切り替え
  <input type="text" ng-readonly="checkValue" value="最上部チェックで読込専用"/><br />
4)ng-selected 選択、未選択を切り替え
  <select>
    <option selected>選択肢1</option>
    <option>選択肢2</option>
    <option ng-selected="checkValue">最上部チェックで有効</option>
  </select>

(9)フォームの入力チェックとCSS設定

AngularJSのフォームで入力チェック、CSS設定



必須項目: 会員番号を入力してください。文字数: 5文字以上。文字数: 10文字以内。文字種: 半角英大文字アルファベットと数字。


必須項目: メールアドレスを入力しでください。メールフォーマットエラー: 正しいメールアドレスフォーマットを入力してください。

入力内容
{{master | json}}

<style>
  form.ng-invalid.ng-dirty { background-color: lightpink; }
  form.ng-valid.ng-dirty { background-color: lightgreen; }
  form { padding: 10px;}
</style>
<form name="appForm" novalidate>
  <div class="well">
    <div class="form-group" ng-class="{'has-error': appForm.name.$invalid && appForm.name.$dirty}">
      <label>会員番号(必須項目、半角英大文字or半角数字5~10文字)</label>
      <input type="text" name="name" class="form-control"
         ng-model="user.name" required
         ng-minlength="5" ng-maxlength="10"
         ng-pattern="/^[A-Z0-9]+$/" />
      <span class="text-danger" ng-show="appForm.name.$dirty && appForm.name.$error.required">必須項目: 会員番号を入力してください。</span>
      <span class="text-danger" ng-show="appForm.name.$dirty && appForm.name.$error.minlength">文字数: 5文字以上。</span>
      <span class="text-danger" ng-show="appForm.name.$dirty && appForm.name.$error.maxlength">文字数: 10文字以内。</span>
      <span class="text-danger" ng-show="appForm.name.$dirty && appForm.name.$error.pattern">文字種: 半角英大文字アルファベットと数字。</span>
    </div>

    <div class="form-group" ng-class="{'has-error': appForm.email.$invalid && appForm.email.$dirty}">
      <label>メールアドレス(必須項目、メールフォーマットチェック)</label>
      <input type="email" name="email" class="form-control"
        ng-model="user.email" required />
      <span class="text-danger" ng-show="appForm.email.$dirty && appForm.email.$error.required">必須項目: メールアドレスを入力しでください。</span>
      <span class="text-danger" ng-show="appForm.email.$dirty && appForm.email.$error.email">メールフォーマットエラー: 正しいメールアドレスフォーマットを入力してください。</span>
    </div>
    <div class="text-center">
      <button ng-disabled="appForm.$invalid" ng-click="save()" class="btn btn-primary">登録
      </button>
    </div>
  </div>
</form>
<div class="well" ng-show="master">
  <strong>入力内容</strong><br />
  {{master | json}}
</div>
var demoApp = angular.module('demoApp', []);
demoApp.controller("formCtrl", function($scope) {
  $scope.user = null;
  $scope.master = null;
  $scope.save = function(){
    $scope.master = angular.copy($scope.user);
  }
});

(10)ng-optionsを使ってSelectメニューを作成

1)オブジェクト全体を値として取得
 

選択した値: {{selectCity1}}

2)オブジェクト内の指定した属性を取得

選択した値: {{selectCity2}}

3)グループ化してオプションを表示

選択した値: {{selectCity3}}


1)オブジェクト全体を値として取得
 
<select ng-model="selectCity1" ng-options="city.name for city in citys">
  <option value="">市区町村を選択してください</option>
</select>

  選択した値: {{selectCity1}}

2)オブジェクト内の指定した属性を取得
<select ng-model="selectCity2" ng-options="city.id as city.name for city in citys">
  <option value="">市区町村を選択してください</option>
</select>

  選択した値: {{selectCity2}}

3)グループ化してオプションを表示
<select ng-model="selectCity3" ng-options="city.id as city.name group by city.pref for city in citys">
  <option value="">市区町村を選択してください</option>
</select>

  選択した値: {{selectCity3}}

var demoApp = angular.module('demoApp', []);
demoApp.controller("formCtrl", function($scope) {
  $scope.citys = [
    { id: "0101", name: "港区", pref: "東京都"},
    { id: "0102", name: "渋谷区", pref: "東京都"},
    { id: "0103", name: "新宿区", pref: "東京都"},
    { id: "0201", name: "横浜市", pref: "神奈川県"},
    { id: "0202", name: "川崎市", pref: "神奈川県"}
  ];
});

(10.1)ng-repeatを使ってラジオボタンを作成

1)$parent属性を使用する方法
 

選択した値: {{selectedPref}}
 
2)ラジオボタンのng-change属性の使用例
 

選択した値: {{data.selectedPref}}

  • {{item}}

1)$parent属性を使用する方法
 <br />
  <div class="radio" ng-repeat="item in prefs">
    <label>
      <input type="radio" ng-model="$parent.selectedPref"
           value="{{item.id}}">{{item.name}}
    </label>
  </div>
  選択した値: {{selectedPref}}<br />
2)ラジオボタンのng-change属性の使用例<br />
 <br />
  <div class="radio" ng-repeat="item in prefs">
    <label>
      <input type="radio" ng-model="data.selectedPref"
           value="{{item.id}}"
           ng-change="data.changePref($index)">{{item.name}}
    </label>
  </div>
  選択した値: {{data.selectedPref}}
  <ul>
    <li ng-repeat="item in data.pref">{{item}}</li>
  </ul>

var demoApp = angular.module('demoApp', []);
demoApp.controller("formCtrl", function($scope) {
  $scope.prefs = [
    { id: "01", name: "東京都"},
    { id: "02", name: "神奈川県"}
  ];
  var prefsDetail = [
    { id: "01", 
      name: "東京都",
      kencho: "新宿区", 
      jinko: "・・・・"},
    { id: "02", 
      name: "神奈川県",
      kencho: "横浜市", 
      jinko: "・・・・"}
  ];
  $scope.selectedPref="01";

  $scope.data = {};
  $scope.data.selectedPref="01";
  $scope.data.pref=prefsDetail[0];
  $scope.data.changePref = function(index) {
    $scope.data.pref=prefsDetail[index];
  };
})

(11)ビルトインのフィルターの使い方

1)降順のorderBy、limitToで表示個数、numberで小数点桁数
 

日時 国語 算数 理科 平均
{{myScore.day}} {{myScore.jpn}} {{myScore.math}} {{myScore.sci}} {{(myScore.jpn + myScore.math + myScore.sci)/3 | number:1}}

2)複数項目でorderBy、属性の値でfilter
 
フィルター:

商品名 分類 価格
{{item.name}} {{item.grp}} {{item.price | number:0}}円


1)降順のorderBy、limitToで表示個数、numberで小数点桁数
 
<table class="table">
  <thead>
    <tr><th>日時</th><th>国語</th><th>算数</th><th>理科</th><th>平均</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="myScore in myScores | orderBy: '-day' |limitTo:3">
      <td>{{myScore.day}}</td>
      <td>{{myScore.jpn}}</td>
      <td>{{myScore.math}}</td>
      <td>{{myScore.sci}}</td>
      <td>{{(myScore.jpn + myScore.math + myScore.sci)/3 | number:1}}</td>
    </tr>
  </tbody>
</table>
  
2)複数項目でorderBy、属性の値でfilter
  フィルター:<input ng-model="query" type="text" placeholder="商品名で検索" autofocus> <table class="table"> <thead> <tr><th>商品名</th><th>分類</th><th>価格</th></tr> </thead> <tbody> <tr ng-repeat="item in products |filter:{chk: 'true',name: query} | orderBy:['grp','price']"> <td>{{item.name}}</td> <td>{{item.grp}}</td> <td>{{item.price | number:0}}円</td> </tr> </tbody> </table>
var demoApp = angular.module('demoApp', []);
demoApp.controller("filterCtrl", function($scope) {
  $scope.myScores = [
    { day: "2014/01/08", jpn: 74 ,math: 52, sci: 68 },
    { day: "2014/03/08", jpn: 54 ,math: 63, sci: 38 },
    { day: "2014/04/08", jpn: 36 ,math: 91, sci: 78 },
    { day: "2014/02/08", jpn: 74 ,math: 52, sci: 48 },
    { day: "2014/11/08", jpn: 48 ,math: 57, sci: 28 },
    { day: "2014/06/08", jpn: 94 ,math: 52, sci: 78 }
  ];
  $scope.products = [
    {name: "デジタルカメラA",grp:"カメラ",price: 8500,chk:true},
    {name: "デジタルカメラD",grp:"カメラ",price: 3500,chk:false},
    {name: "パソコンB",grp:"パソコン",price: 15900,chk:true},
    {name: "デジタルカメラB",grp:"カメラ",price: 9800,chk:true},
    {name: "パソコンD",grp:"パソコン",price: 5900,chk:false},
    {name: "パソコンC",grp:"パソコン",price: 25900,chk:true},
    {name: "パソコンA",grp:"パソコン",price: 14900,chk:true}
  ];
});

(12)ビルトインのフィルターで関数を使用

1)filterで関数を使用
 

日時 国語 算数 理科 平均
{{myScore.day}} {{myScore.jpn}} {{myScore.math}} {{myScore.sci}} {{myScore.jpn + myScore.math + myScore.sci}}

2)orderByで式を指定して、項目クリックでソート
 
[ 初期状態に戻す ]

日時 国語 算数 理科 合計
{{myScore.day}} {{myScore.jpn}} {{myScore.math}} {{myScore.sci}} {{myScore.jpn + myScore.math + myScore.sci}}

3)orderByで関数を使用
 

商品名 価格 在庫数
{{item.name}} {{item.price | number:0}}円 {{item.stock}}

1)filterで関数を使用
 
<table class="table">
  <thead>
    <tr><th>日時</th><th>国語</th><th>算数</th><th>理科</th><th>合計</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="myScore in myScores | filter:selectPass">
      <td>{{myScore.day}}</td>
      <td>{{myScore.jpn}}</td>
      <td>{{myScore.math}}</td>
      <td>{{myScore.sci}}</td>
      <td>{{myScore.jpn + myScore.math + myScore.sci}}</td>
    </tr>
  </tbody>
</table>
  <br />
2)orderByで式を指定して、項目クリックでソート<br />
 
[ <a href="" ng-click="sortClm=''">初期状態に戻す</a> ]
<table class="table">
  <thead>
    <tr>
      <th><a href="" ng-click="sortClm = 'day'; reverse=!reverse">日時</a></th>
      <th><a href="" ng-click="sortClm = 'jpn'; reverse=!reverse">国語</a></th>
      <th><a href="" ng-click="sortClm = 'math'; reverse=!reverse">算数</a></th>
      <th><a href="" ng-click="sortClm = 'sci'; reverse=!reverse">理科</a></th>
      <th>合計</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="myScore in myScores | orderBy:sortClm:reverse">
      <td>{{myScore.day}}</td>
      <td>{{myScore.jpn}}</td>
      <td>{{myScore.math}}</td>
      <td>{{myScore.sci}}</td>
      <td>{{myScore.jpn + myScore.math + myScore.sci}}</td>
    </tr>
  </tbody>
</table>
  <br />
3)orderByで関数を使用<br />
 
<table class="table">
  <thead>
    <tr><th>商品名</th><th>価格</th><th>在庫数</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products | orderBy:customOrder">
      <td>{{item.name}}</td>
      <td>{{item.price | number:0}}円</td>
      <td>{{item.stock}}</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("filterCtrl", function($scope) {
  $scope.myScores = [
    { day: "2014/01/08", jpn: 74 ,math: 52, sci: 68 },
    { day: "2014/03/08", jpn: 54 ,math: 63, sci: 38 },
    { day: "2014/04/08", jpn: 36 ,math: 91, sci: 78 },
    { day: "2014/02/08", jpn: 74 ,math: 52, sci: 48 },
    { day: "2014/11/08", jpn: 48 ,math: 57, sci: 28 },
    { day: "2014/06/08", jpn: 94 ,math: 52, sci: 78 }
  ];
  $scope.products = [
    {name: "デジタルカメラA",price: 8500,stock:3},
    {name: "デジタルカメラD",price: 3500,stock:0},
    {name: "パソコンB",price: 15900,stock:6},
    {name: "デジタルカメラB",price: 9800,stock:3},
    {name: "パソコンD",price: 5900,stock:0},
    {name: "パソコンC",price: 25900,stock:1},
    {name: "パソコンA",price: 14900,stock:10}
  ];
  $scope.selectPass = function (item) {
    if ((item.jpn + item.math + item.sci) > 180 ) {
      return item;
    }
  };
  $scope.customOrder = function (item) {
    return item.stock == 0 ? 99999 : item.price;
  };
})

(13)カスタムフィルター

1)単一の属性値を変換するカスタムフィルター
 

予定 チェック
{{item.action}} {{item.chk | checkmark}}

2)配列データをフィルタリングするカスタムフィルター
 

商品名 分類 価格
{{item.name}} {{item.grp}} {{item.price | number:0}}円

1)単一の属性値を変換するカスタムフィルター
 
<table class="table">
  <thead>
    <tr><th>予定</th><th>チェック</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in todos">
      <td>{{item.action}}</td>
      <td>{{item.chk | checkmark}}</td>
    </tr>
  </tbody>
</table>
  <br />
2)配列データをフィルタリングするカスタムフィルター<br />
 
<select ng-model="selectGrp" ng-options="item.grp as item.grp for item in products | distinct:'grp'">
  <option value="">商品分類を選択してください</option>
</select>
<table class="table">
  <thead>
    <tr><th>商品名</th><th>分類</th><th>価格</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products |filter:{grp: selectGrp}">
      <td>{{item.name}}</td>
      <td>{{item.grp}}</td>
      <td>{{item.price | number:0}}円</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("filterCtrl", function($scope) {
  $scope.products = [
    {name: "デジタルカメラA",grp:"カメラ",price: 8500},
    {name: "デジタルカメラD",grp:"カメラ",price: 3500},
    {name: "パソコンB",grp:"パソコン",price: 15900},
    {name: "デジタルカメラB",grp:"カメラ",price: 9800},
    {name: "パソコンD",grp:"パソコン",price: 5900},
    {name: "テレビC",grp:"テレビ",price: 25900},
    {name: "パソコンA",grp:"パソコン",price: 14900}
  ];

  $scope.todos = [
    {action: "データベースのバックアップ",chk:true},
    {action: "AngularJSの勉強",chk:false},
    {action: "ログの確認",chk:true},
    {action: "JavaScriptの勉強",chk:false},
    {action: "レポートを作成",chk:true},
  ];
})
demoApp.filter('checkmark', function() {
  return function(input) {
    return input ? '\u2713' : '';
  };
})

demoApp.filter("distinct", function () {
  return function (data, keyName) {
    var results = [];
    var keys = {};
    for (var i = 0; i < data.length; i++) {
      var val = data[i][keyName];
      if (!keys[val]) {
        keys[val] = true;
        results.push(data[i]);
      }
    }
    return results;
  }
});

(14)AngularJSとBootstrap3を使ってページング

ステップ1)配列データをオフセットと表示個数を指定して表示
 

:
名前 年齢 住所
{{item.id}} {{item.name}} {{item.age}} {{item.address}}

ステップ2)配列データをページングで表示
 

名前 年齢 住所
{{item.id}} {{item.name}} {{item.age}} {{item.address}}

ステップ3)ページリンクのCSS設定
 

名前 年齢 住所
{{item.id}} {{item.name}} {{item.age}} {{item.address}}

ステップ1)配列データをオフセットと表示個数を指定して表示
 
<form class="form-inline">
  <input ng-model="i_offset" type="text" placeholder="オフセット">
  <input ng-model="i_size" type="text" placeholder="表示個数">
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <th>№</th><th>名前</th><th>年齢</th><th>住所</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends | offset: i_offset | limitTo: i_size">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.age}}</td>
      <td>{{item.address}}</td>
    </tr>
  </tbody>
</table>
  <br />
ステップ2)配列データをページングで表示<br />
 
<form class="form-inline">
  <div class="form-group">
    <label>1ページの件数:</label>
    <input ng-model="itemsPerPage" type="text">
  </div>
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <th>№</th><th>名前</th><th>年齢</th><th>住所</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends | offset: (currentPage-1)*itemsPerPage | limitTo: itemsPerPage">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.age}}</td>
      <td>{{item.address}}</td>
    </tr>
  </tbody>
  <tfoot>
    <td colspan="4">
      <ul class="pagination">
        <li>
          <a href="#" ng-click="prevPage()">≪ 前へ</a>
        </li>
        <li ng-repeat="n in range()" ng-click="setPage(n)">
          <a href="#">{{n}}</a>
        </li>
        <li>
          <a href="#" ng-click="nextPage()">次へ ≫</a>
        </li>
      </ul>
    </td>
  </tfoot>
</table>
  <br />
ステップ3)ページリンクのCSS設定<br />
 
<form class="form-inline">
  <div class="form-group">
    <label>1ページの件数:</label>
    <input ng-model="itemsPerPage" type="text">
  </div>
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <th>№</th><th>名前</th><th>年齢</th><th>住所</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends | offset: (currentPage-1)*itemsPerPage | limitTo: itemsPerPage">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.age}}</td>
      <td>{{item.address}}</td>
    </tr>
  </tbody>
  <tfoot>
    <td colspan="4">
      <ul class="pagination">
        <li ng-class="prevPageDisabled()">
          <a href="#" ng-click="prevPage()">≪ 前へ</a>
        </li>
        <li ng-repeat="n in range()"  ng-class="{active: n == currentPage}" ng-click="setPage(n)">
          <a href="#">{{n}}</a>
        </li>
        <li ng-class="nextPageDisabled()">
          <a href="#" ng-click="nextPage()">次へ ≫</a>
        </li>
      </ul>
    </td>
  </tfoot>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("pagingCtrl", function($scope) {
  $scope.itemsPerPage = 3;
  $scope.currentPage = 1;
  $scope.friends = [
    { id: 1, name: "相田",   age: 20 ,address: "東京都品川区"},
    { id: 2, name: "伊藤",   age: 55 ,address: "神奈川県横浜市"},
    { id: 3, name: "上野",   age: 20 ,address: "埼玉県川越市"},
       :
  ];
  $scope.range = function() {
    $scope.maxPage = Math.ceil($scope.friends.length/$scope.itemsPerPage);
    var ret = [];
    for (var i=1; i<=$scope.maxPage; i++) {
      ret.push(i);
    }
    return ret;
  };
  $scope.setPage = function(n) {
    $scope.currentPage = n;
  };
  $scope.prevPage = function() {
    if ($scope.currentPage > 1) {
      $scope.currentPage--;
    }
  };
  $scope.nextPage = function() {
    if ($scope.currentPage < maxPage) {
      $scope.currentPage++;
    }
  };
  $scope.prevPageDisabled = function() {
    return $scope.currentPage === 1 ? "disabled" : "";
  };

  $scope.nextPageDisabled = function() {
    return $scope.currentPage === $scope.maxPage ? "disabled" : "";
  };
})
demoApp.filter('offset', function() {
  return function(input, start) {
    start = parseInt(start);
    return input.slice(start);
  };
})

(15)スクリプト内でフィルターを使用、既存のフィルターを拡張

1)コントローラ内でフィルターを使用

①filterFilterの書式を使用
 

商品番号 商品名 価格
{{item.no}} {{item.name}} {{item.price | number:0}}円

②$filterを使用
 

商品番号 商品名 価格
{{item.no}} {{item.name}} {{item.price | number:0}}円

2)既存のフィルターを拡張
 



商品番号 商品名 価格
{{item.no}} {{item.name}} {{item.price | number:0}}円

1)コントローラ内でフィルターを使用<br />
<br />
①filterFilterの書式を使用<br />
 
<table class="table">
  <thead>
    <tr><th>商品番号</th><th>商品名</th><th>価格</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in trueProducts">
      <td>{{item.no}}</td>
      <td>{{item.name}}</td>
      <td>{{item.price | number:0}}円</td>
    </tr>
  </tbody>
</table><br />
②$filterを使用<br />
 
<table class="table">
  <thead>
    <tr><th>商品番号</th><th>商品名</th><th>価格</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in pcProducts">
      <td>{{item.no}}</td>
      <td>{{item.name}}</td>
      <td>{{item.price | number:0}}円</td>
    </tr>
  </tbody>
</table>
  <br />
2)既存のフィルターを拡張<br />
 
<form class="form-inline">
  <input ng-model="i_offset" type="text" placeholder="オフセット">
  <input ng-model="i_size" type="text" placeholder="表示個数">
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <tr><th>商品番号</th><th>商品名</th><th>価格</th></tr>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products | range:i_offset:i_size">
      <td>{{item.no}}</td>
      <td>{{item.name}}</td>
      <td>{{item.price | number:0}}円</td>
    </tr>
  </tbody>
</table>

var demoApp = angular.module('demoApp', []);
demoApp.controller("filterCtrl", function($scope,filterFilter,$filter) {
  $scope.products = [
    {no: 1,name: "デジタルカメラA",price: 8500,chk:true},
    {no: 2,name: "デジタルカメラD",price: 3500,chk:false},
    {no: 3,name: "パソコンB",price: 15900,chk:true},
    {no: 4,name: "デジタルカメラB",price: 9800,chk:true},
    {no: 5,name: "パソコンD",price: 5900,chk:false},
    {no: 6,name: "パソコンC",price: 25900,chk:true},
    {no: 7,name: "パソコンA",price: 14900,chk:true}
  ];

  $scope.trueProducts = filterFilter($scope.products, {chk: 'true'});
  $scope.pcProducts = $filter("filter")($scope.products, {name: 'パソコン'});
})

demoApp.filter('offset', function() {
  return function(input, start) {
    start = parseInt(start);
    return input.slice(start);
  };
})

demoApp.filter('range', function($filter) {
  return function (input, offset, count) {
    var offsetInput = $filter("offset")(input, offset);
    return $filter("limitTo")(offsetInput, count);
  }
})

関連記事の目次

JavaScript、ECMAScript、TypeScriptの関係

JavaScriptとECMAScriptの各バージョンとの関係、TypeScriptとECMAScriptの各バージョンとの関係について確認し、まとめています。tscコマンドでTypeScriptをJavaScriptにコンパイルする際、ECMAScriptのバージョンを指定することも出来ます。
続きを読む

関連記事の目次