Angular.jsで、ユーザーがイベントを発生させるまでデータが更新されない状態が発生したので、調べたことをメモしておきます。
サンプルコード1
データが更新されなくなったサンプルです。
HTML
<div ng-controller="vaList"> <button ng-click="click()">特に何も行わないクリックイベント</button> <ul class="va-list"> <li class="va-list-item" ng-repeat="actor in actorData"> <div class="va-list-item_name">{{actor.name}} <span class="va-list-item_belong">(所属:{{actor.belong}})</span></div> <div class="va-list-item_birthday">生年月日:{{actor.birthday}}</div> </li> </ul> </div>
JavaScript
angular.module('app', []).controller('vaList', function($scope) { $scope.actorData = ''; $scope.click = function() {} setTimeout(function() { $scope.actorData = [ { "name": "安済 知佳", "kana_en": "anzai chika", "kana_jp": "あんざい ちか", "birthday": "非公開", "belong": "エイベックス・ピクチャーズ" }, { "name": "高橋 李依", "kana_en": "takahashi rie", "kana_jp": "たかはし りえ", "birthday": "1994.2.27", "belong": "81プロデュース" } ~ 略 ~ { "name": "早見 沙織", "kana_en": "hayami saori", "kana_jp": "はやみ さおり", "birthday": "1991.5.29", "belong": "アイムエンタープライズ" } ]; }, 1000); });
一定時間後にデータを変更するためにsetTimeoutを使っていますが、実際はデータベースからデータを取得して変更しようとしたときに更新されませんでした。
クリックなどのイベントが発生するとデータが更新されました。
データが更新されないデモページ
サンプルコード2
$apply()を使うことで、データの更新ができました。
JavaScript
angular.module('app', []).controller('vaList', function($scope) { $scope.actorData = ''; $scope.click = function() {} setTimeout(function() { $scope.$apply(function () { $scope.actorData = [ { "name": "安済 知佳", "kana_en": "anzai chika", "kana_jp": "あんざい ちか", "birthday": "非公開", "belong": "エイベックス・ピクチャーズ" }, { "name": "高橋 李依", "kana_en": "takahashi rie", "kana_jp": "たかはし りえ", "birthday": "1994.2.27", "belong": "81プロデュース" } ~ 略 ~ { "name": "早見 沙織", "kana_en": "hayami saori", "kana_jp": "はやみ さおり", "birthday": "1991.5.29", "belong": "アイムエンタープライズ" } ]; }); }, 1000); });
サンプルコード3
実際にsetTimeoutを使いたい場合、代わりに$timeout()を使うといいようです。
JavaScript
angular.module('app', []).controller('vaList', function($scope, $timeout) { $scope.actorData = ''; $scope.click = function() {} $timeout(function() { $scope.actorData = [ { "name": "安済 知佳", "kana_en": "anzai chika", "kana_jp": "あんざい ちか", "birthday": "非公開", "belong": "エイベックス・ピクチャーズ" }, { "name": "高橋 李依", "kana_en": "takahashi rie", "kana_jp": "たかはし りえ", "birthday": "1994.2.27", "belong": "81プロデュース" } ~ 略 ~ { "name": "早見 沙織", "kana_en": "hayami saori", "kana_jp": "はやみ さおり", "birthday": "1991.5.29", "belong": "アイムエンタープライズ" } ]; }, 1000); });
【参考サイト】
コメントが承認されるまで時間がかかります。