ajaxzip3は、郵便番号を入力するだけで自動で住所を表示してくれる機能です。google codeが終了し、githubでの運用に変わったので、古いコードは修正が必要です。
angularJS + ajaxZip3の注意事項
Angular JSを使っていても、ajaxZip3は動作しますが、1点だけ問題があります。
郵便番号を入力して、住所が自動で代入されても、angular js側で住所の値がセットされたことを検知してくれないことです。
住所の後ろに番地などを入力すれば、問題なく反映されてきますが、何らかの変更を加えない限り$scope上の住所は空欄のままということになります。
<input type="text" ng-model="zip" ng-maxlength="8" name="zip11" onKeyUp="AjaxZip3.zip2addr(this,'','addr11','addr11');"> <input type="text" id="trg" name="addr11" ng-model="addr" ng-maxlength="32">
郵便番号のフォーム(zip11)が変わると、onKeyUpのイベントが発生します。そして郵便番号に対応する住所がaddr11に代入されます。
何故バインドされないのか?
AngularJSは双方向データバインドという仕組みで動作していますが、外部から書き換えられた値(例えばajaxZip3から書き換えられた値等)はデータバインディングされず、フォーム上の値とscopeの値にズレが生じてしまいます。フォームの画面上は住所が入っているのに、バインドされているscopeは変わる前(空欄)のままということになってしまいます。
外部からのイベントを検知する仕組み
$applyを使うことで強制的にバインドさせることができます。
var update = function() { var target = document.getElementById("trg"); $log.info(target.value); $scope.addr = target.value; }; update(); setInterval(function() { $scope.$apply(update); }, 1000);
この例では、1秒ごとにテキストボックス(addr11)の値を取得し、$scope.addrに代入しています。
他に良いやり方があるのかわかりませんが、とりあえずこれで動きました。
しかし、フレームワークを使うのが当たり前のJavaScriptで、document.getElementByIdなんて久しぶりに使いました。