AngularJSのFilterが2重評価されてる?
最近少しずつAngularJSのドキュメントを読んでいます。Backbone.jsをすっ飛ばしてAngularJSを組み込んでしまおうという目論見です。
今日ちょうどCreating Angular Filtersの項を試していたのですが、どうもAngularJSの Filterが2重評価されているような気がします。
例えば、以下のようにreverse Filterにログ出力を埋め込んだとします。
angular.module('MyReverseModule', []). filter('reverse', function() { return function(input, uppercase) { console.log(uppercase) // デバッグ用のログ出力 var out = ""; for (var i = 0; i < input.length; i++) { out = input.charAt(i) + out; } // conditional based on optional argument if (uppercase) { out = out.toUpperCase(); } return out; } }); function Ctrl($scope) { $scope.greeting = 'hello'; }
htmlファイルでreverse Filterは2回使われています。
<!doctype html> <html ng-app="MyReverseModule"> <head> <script src="http://code.angularjs.org/1.0.2/angular.js"></script> <script src="script.js"></script> </head> <body> <div ng-controller="Ctrl"> <input ng-model="greeting" type="greeting"><br> No filter: {{greeting}}<br> Reverse: {{greeting|reverse}}<br> Reverse + uppercase: {{greeting|reverse:true}}<br> </div> </body> </html>
従ってコンソールにはundefinedとtrueがそれぞれ1回ずつ出力されると思うのですが、
undefined, true, undefined, trueと何故か2回ずつ表示されます。