Javascript 在flex(web控件)中使用angularjs并尝试加载模板/json(本地文件)时出现跨域错误

Javascript 在flex(web控件)中使用angularjs并尝试加载模板/json(本地文件)时出现跨域错误,javascript,apache-flex,angularjs,cross-domain,local-files,Javascript,Apache Flex,Angularjs,Cross Domain,Local Files,让我给你讲一点我正在尝试做的事情的历史 我使用Flex应用程序作为web应用程序的容器。因此,在这个Flex应用程序中,它有一个web控制器,可以加载一个成熟的Angularjs应用程序。所有文件都存储在Flex应用程序的本地 当我尝试运行它时,它无法加载任何模板;它们使用$routeProvider加载,数据使用$http.get提取 核心问题是,它不允许我使用JavaScript提取本地文件,即使它是从文件系统中运行的(不使用web服务器) 我也在Chrome上测试了它,并且有同样的问题——

让我给你讲一点我正在尝试做的事情的历史

我使用Flex应用程序作为web应用程序的容器。因此,在这个Flex应用程序中,它有一个web控制器,可以加载一个成熟的
Angularjs
应用程序。所有文件都存储在Flex应用程序的本地

当我尝试运行它时,它无法加载任何模板;它们使用$routeProvider加载,数据使用$http.get提取

核心问题是,它不允许我使用JavaScript提取本地文件,即使它是从文件系统中运行的(不使用web服务器)

我也在Chrome上测试了它,并且有同样的问题——给出了以下错误

访问控制允许原点不允许原点为空。

有了Chrome,可以使用
——允许从文件访问文件
,来修复它,但不知道如何通过Flex/Flash web控制器使其工作


任何帮助都将不胜感激。

不幸的是,您可能无法。我不知道Flex引擎在它的web控制器中包含了什么,但您之所以会遇到这种情况,是因为安全性

它的存在是有充分理由的,它是为了防止JS直接访问您的文件系统

我建议采取两种解决办法之一

  • 捆绑一个简单的Web服务器。比如说

  • 修改AngularJS应用程序(可能还有$routeProvider)以使用

  • 这有点麻烦,但是将模板的所有内容复制到


此外,您可以尝试使用$http.jsonp而不是$http.get,尽管您可能必须更改angularJS代码……

如果您还没有这样做的话。尝试为应用程序设置策略

问题肯定是由于浏览器强制执行了此安全约束。在您的情况下,浏览器是flex web控件

如果不使用web服务器,您可能无法绕过此问题。当请求文件时,跨源资源共享策略将不允许在未经提供文件服务的主机事先授权的情况下加载资源,此授权以http头的形式出现,例如:


访问控制允许源代码:

我相信Flex中至少有两种呈现网页的实现。我很快检查了文档,发现file://uri模式允许本地XMLHttpRequests(基本上就是$http.get所做的)。

我感到困惑。您正在构建AIR桌面应用程序吗?如果是这样,那么Flex应该没有跨域问题。如果您正在构建基于浏览器的应用程序;使用Flex应用程序作为web应用程序的容器意味着什么?它是一个桌面应用程序,不应该有任何问题,但它有。项目的限制不允许我运行任何类型的web服务器。所以我没有办法像Chrome那样关闭安全限制?毕竟它使用的是网络工具包,所以一定有办法。作为一个独立的应用程序,我应该完全控制web视图/控制器。抱歉,因为我对Flex还很陌生。我认为限制在JavaScript规范中,Chrome应用程序(不是webkit和/或V8 JS引擎)提供了覆盖该特定限制的功能。记住Chrome和webkit是不同的。所以flex需要提供与Chrome类似的覆盖,而flex不提供任何形式的定制?除了
mx:html
,我还可以使用其他web视图/控制器吗?必须有一些参数,我可以在那里传递。这似乎太有限了。不过,这不会改变
$routeProvider
访问文件的方式。我的意思是,您还应该改变AngularJS中$routeProvider的行为。为了能够通过jsonp获得模板,我不得不做一些类似的更改。我知道这不是最好的方法,但这是我发现唯一有效的方法。啊,我明白你的意思。问题是,每次AngularJS更新时,我都必须更新。我之所以将其创建为Flex中的Web应用程序,是为了在我们决定将其移动到真正基于Web的平台时可以重用该功能。是的,这是我也发现的主要问题,但现在这是我发现的解决问题的唯一方法。我将继续回答这个问题,以防给出的解决方案也能解决我的问题。是的,我尝试过设置它,但正如您所说,如果没有web服务器,它就无法工作。您可以通过
$http.defaults.headers.common[“origin”]=“somedomain”向http请求添加origin头
尽管您还需要以某种方式欺骗对初始请求的响应上的
访问控制允许来源:
。然而,这并不容易。我可以问一下为什么要求不使用web服务器吗?在javascript中进行http调用以加载文件需要某种web服务器,这是无法回避的。然而,它可能是一个非常简单的web服务器。即使是你自己编写的node.js或其他语言。我查看了StageWebView,但它缺少从JavaScript返回Flex AIR应用程序所需的功能,反之亦然。