2013-05-10 5 views
5

私がしようとしていることについて少しの歴史を教えてください。flexj(Webコントロール)内でangularjsを使用しているときにクロスドメインエラーを取得し、テンプレート/ json(ローカルファイル)を読み込もうとしています

私はWebアプリケーションのコンテナとしてFlexアプリケーションを使用しています。したがって、このFlexアプリケーション内には完全な本物のAngularjsアプリケーションをロードするWebコントローラがあります。すべてのファイルは、Flexアプリケーション内にローカルに保存されます。

実行しようとすると、テンプレートをロードできません。 $ routeProviderを使用してロードされ、$ http.getを使用してデータが取得されます。

コアの問題は、ファイルシステム(Webサーバーを使用しない)から実行されているにもかかわらず、JavaScriptを使用してローカルファイルをプルすることができないことです。

私もChromeでテストしたところ、同じ問題があり、次のエラーが発生しました。 Chromeで

Origin null is not allowed by Access-Control-Allow-Origin.

、それが--allow-file-access-from-filesを使用して固定することができますが、それは、Flex /フラッシュウェブコントローラを介して作業を取得する方法を見つけ出すことはできません。

ご協力いただければ幸いです。

+0

私は混乱しています。あなたはAIR Desktopアプリケーションを構築していますか?その場合、Flexにはクロスドメインの問題はありません。ブラウザベースのアプリケーションを構築する場合FlexアプリケーションをWebアプリケーションのコンテナとして使用することはどういう意味ですか? – JeffryHouser

+0

これはデスクトップアプリです。問題はありませんが、それはあります。 – xil3

答えて

1

残念ながら、おそらくできません。私はそれがWebコントローラであることをFlexがどのように包んでいるのかわかりませんが、あなたがこれにぶつかっている理由はセキュリティです。

これは正当な理由から、JSがファイルシステムに直接アクセスできないようにするためです。

私は2つの回避策のいずれかを提案します。

  • シンプルなウェブサーバーをバンドルします。例えばhttps://stackoverflow.com/questions/530787/simple-http-web-server

  • は、それはハッセルのビットだnew File API

  • を使用するAngularJSのApp(そしておそらく$ routeProvider)を変更したが<script type="text/ng-template" id="some-id"></script>

  • でメインファイルへのあなたのテンプレートのすべての内容をコピー
+0

プロジェクトの制限によって、私はどんな種類のWebサーバーを稼働させることもできません。だから、Chromeにあるようにセキュリティ制限を解除する方法はないのですか?結局のところウェブキットを使用しているので、方法が必要です。スタンドアロンのアプリケーションとして、Webビュー/コントローラを完全に制御する必要があります。そして、私はフレックスにとってかなり新しいので、謝罪します。 – xil3

+0

私はJavaScriptの仕様に制限があると思っています。Chromeアプリケーション(WebkitやV8 JSエンジンではない)は、その特定の制限を無効にする手段を提供しています。 ChromeとWebkitは同じではないことを忘れないでください。したがって、flexはChromeと同様のオーバーライドを提供する必要があります。 – fredrik

+0

Flexにはカスタマイズはありません。 'mx:html'以外の他のウェブビュー/コントローラがありますか?私はそこに渡すことができるいくつかのパラメータがある必要があります。ちょうど制限するようです。 – xil3

0

また、あなたがまだの場合は、angularJSコードを変更する....

+0

それは '$ routeProvider'がファイルにアクセスする方法を変更しません。 – xil3

+0

私はAngularJSで$ routeProviderの振る舞いも変更する必要があることを意味しました。私はjsonp経由でテンプレートを取得できるように、同様の変更を加えなければなりませんでした。 私はそれが最良の方法ではないことを知っていますが、私が見つけたのはそれが唯一のものです。 – Eylen

+0

ああ、私はあなたが意味するものを参照してください。その問題は、アップデートがあるたびにAngularJSを更新する必要があることです。私がFlexでWeb Appとして作成しているのは、その機能を真のWebベースのプラットフォームに移行するために再利用できるからです。 – xil3

2

を持っているかもしれないが、代わりに$ http.getの$ http.jsonpを使用することを試みることができますそうしました。アプリケーションにcrossdomainポリシーを設定してみてください。

問題は確かにCORSに起因しています。ブラウザはこのセキュリティ制約を適用します。あなたの場合、ブラウザはフレックスウェブコントロールです。

Webサーバーを使用せずにこの問題を回避することはできません。ファイルに対する要求が行われると、クロス・ソース・リソース共有ポリシーは、ファイルを処理するホストからの事前の許可なしにリソースをロードすることを許可しません。この許可は、httpヘッダーの形式で提供されます。

Access-Control-Allow-Origin: *

+0

ええ、私はそれを設定しようとしましたが、Webサーバーなしでは動作しません。 – xil3

+0

'$ http.defaults.headers.common [" origin "] = 'somedomain'を介してhttpリクエストにオリジンヘッダーを追加することができます。 'あなたはまた、何らかの形で最初のリクエストに対する応答で' Access-Control-Allow-Origin:* 'を偽装する必要があります。しかし、そう簡単にはできません。なぜ私はWebサーバーを使用しないという要件を尋ねることができますか? javascriptでファイルをロードするためのhttp呼び出しを行うには、何らかの種類のWebサーバーが必要です。しかし、非常にシンプルなWebサーバーである可能性があります。あなたがnode.jsや他の言語であなた自身を書くことさえも。 –

0

FlexでWebページをレンダリングする実装が少なくとも2つあると思います。私はすぐにStageWebViewのドキュメントをチェックして、ファイル:// uri schemeがローカルのXMLHttpRequests(基本的に$ http.getがやっていること)が可能であることを発見しました。

+0

StageWebViewをチェックアウトしましたが、JavaScriptからFlex AIRアプリケーションへの通信に必要な機能がなく、逆もあります。 – xil3

関連する問題