クライアント側のソース。今回のjQueryは1.3.1を利用しています。
$.ajax({
url: ‘http://hogehoge.com/api/,
dataType: ‘jsonp’,
success: function(data)
{
成功時のコールバック関数
}
});
hogehoge.com/api/に目的のAPIが置いてある前提です。そこにアクセスします。で、サーバ側のアクセスログを観ていると、実際にアクセスしてくるURIは
http://hogehoge.com/api/?callback=jsonp1235002429334&_=1235002440850
となっています。jQueryが付与しているんですかね。これは、結果は「jsonp1235002429334」というコールバック関数に渡してね、という意味合いのようです。クライアント側でコールバック関数の名前を指定していないのにちゃんと成功時のコールバック関数が呼ばれるのは、jQueryがこっそりと処理してくれていたからのようです。
で、サーバ側のレスポンスは
jsonp1235002429334({“address”:”東京都足立区大谷田”});
でOK。これは例として、郵便番号を投げると該当住所を返すapiです。値はクライアント側コールバック関数のdataに格納されます。住所にアクセスしたい場合は
data.address
で「東京都足立区大谷田」が返ってきます。jsonpを利用することでクロスドメインが可能になります。これで郵便番号から住所に変換、メールアドレスの正規表現チェック、等々の共通処理は一元管理できます。マスタが一箇所で済むのはメンテナンスも楽になります。
ただ、インターネット上に公開されているので、どこからアクセスがあるかわかりません。ホストで絞る、等の制限は必要かもしれませんね。
こんなの「tab_chenge」みたいなイベントがあって、それで制御できるだろうと思い込んでいました。っていうか、もしかしたらあるのかもしれない。例によって正解かどうかわかりませんが、期待通りの動きだと思います。
<mx:TabNavigator id=”tabnavigator1″ change=”tab_change(event)”>
<mx:Canvas label=”タブ1”>
</mx:Canvas>
<mx:Canvas label=”タブ2”>
</mx:Canvas>
</mx:TabNavigator>
上記がMXML。TabNavigatorに「タブが切り替わったら教えろや」ってイベントを設定しておきます。
private function tab_change(event:Event):void
{
switch(tabnavigator1.selectedIndex.toString())
{
case ‘3’:
currentState = “search”;
break;
default:
currentState = “”;
break;
}
}
で、これがAS側。あ、引数のevent使ってないや。上記の例だと、選択されたタブのインデックスが3(当然、0から始まるので4枚目のタブ、っていう意味です)だったら、Stateを「search」に切り替えてくださいという意味です。それ以外のタブがクリックされたら、ベースステートに戻ってくれます。
Canvasにclickイベントを設定しておいても、タブ自体がクリックされたイベントは判定してくれないんですね。タブはタブであって、Canvasではない、ということでしょう。まぁ確かにその通りです。
きっと、もっと美しい書き方があるのでしょう。ご存知の方が教えてくれるとうれしく思います。
不慣れなActionScript、はじめてのAIR開発とあって、いろんなことでつまづき続けています。
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml” applicationComplete=”init()” layout=”absolute”>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.events.CloseEvent;
private function init():void
{
addEventListener(Event.CLOSING,application_closing);
}
private function application_closing(event:Event):void
{
event.preventDefault();
Alert.show(“終了しますか?”,”終了の確認”,Alert.YES | Alert.CANCEL,null,goto_close);
}
private function goto_close(event:CloseEvent):void
{
if(event.detail==Alert.YES)
{
nativeWindow.close();
}
}
]]>
</mx:Script>
</mx:WindowedApplication>
applicationCompleteでイベントリスナーを追加しています。「closingイベントが起こったら呼べや」っていう感じですね。
で、呼ばれた関数の中で、ひとまずclosingイベントをキャンセルしています。確認云々のまえにキャンセルです。問答無用です。そのあと、確認します。キャンセルしておいて確認です。
確認ダイアログは、結果もコールバック関数です。これもはじめは違和感バリバリでした。C#だとそこで1回処理がとまるじゃないですか。基本的にすべてコールバック関数。慣れるまで戸惑いそうです。
確認ダイアログの結果によって、プログラムからアプリケーションを終了します。
正直、これが正しい実装方法なのかはまったくわかりません。こんな泥臭い方法じゃなくて、もっとスマートな記述方法があるのかもしれません。
まぁ、やりたかったことはできているようなのでOKかなと。
AIR 1.5、ActionScript 3.0です。
いまさら唐突にRIA開発がやってみたくなりました。ホントにいまさらです。選択肢はSilverlight2.0、Flex、Ajaxあたりでしょう。ハセテツのなかで、FlexとFLASHは別物です。タイムラインの概念があるのとないのとでは大違いです。
Ajaxはprototype.js、jquery等便利なライブラリがありますが、それでもコーディング量は多くなりそうな気がしてパス。
Silverlight2.0はC#が使えるということもあり、大本命だったのですがなんとなくFireFoxでの挙動が怪しかったりIEがフリーズ頻発したりでパス。あと、WPFの資料が少なすぎでギブ。Expression Blend 2もあんまり役に立ってくれなかった。コレであの値段って高くない?ターゲットブラウザがIEだけでいいっていうならアリだと思います。
で、Flex。これはRIAとしてのFlex、インストール型アプリケーションとしてのAIRが含まれます。豊富なTips、便利なFlex Builder、安定したマルチプラットフォーム。大量のリファレンス。決定ですね。Flex Builder3もあの機能であればさほど高価ではないでしょう。
フロントエンドはFlex、AIR。サーバサイドはRoR。しばらくはコレでいってみようと思います。
send_file(サーバ上のファイルパス, :type=>’application/pdf’, :filename => ダウンロード時に使用されるファイル名)
ファイルパスだけでもダウンロードは可能。その場合Content-typeはどうなるんだろう。application/octet-streamなのかなぁ。例によって確認してません。ファイル名も必須ではありません。