2013-05-10 2 views
5

Позвольте мне рассказать немного о том, что я пытаюсь сделать.Получение междоменных ошибок при использовании углов в flex (веб-управление) и попытка загрузить шаблоны/json (локальные файлы)

Я использую приложение Flex, как контейнер для веб-приложения. Таким образом, в этом приложении Flex есть веб-контроллер, который загружает полноценное приложение Angularjs. Все файлы хранятся локально в приложении Flex.

Когда я пытаюсь запустить его, он не может загрузить ни один из шаблонов; они загружаются с использованием $ routeProvider, и данные извлекаются с помощью $ http.get.

Основная проблема заключается в том, что он не позволяет мне вытаскивать локальные файлы с помощью JavaScript, даже несмотря на то, что он отключается от файловой системы (не используя веб-сервер).

Я также тестировал его на Chrome и имел ту же самую проблему, что дало следующую ошибку.

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

С Chrome, это может быть исправлено с помощью --allow-file-access-from-files, но не могу понять, как заставить его работать через веб-контроллера Flex/Flash-памяти.

Любая помощь была бы принята с благодарностью.

+0

Я смущен. Вы создаете приложение AIR Desktop? ЕСЛИ так, тогда у Flex не должно быть проблем с перекрестным доменом. Если вы создаете приложение на основе браузера; что означает использовать приложение Flex в качестве контейнера для веб-приложения? – JeffryHouser

+0

Это настольное приложение, которое не должно иметь никаких проблем, но это так. – xil3

ответ

1

К сожалению, вы, вероятно, не можете. Я не знаю, какой движок Flex обертывается в его веб-контроллерах, но причина, по которой вы сталкиваетесь, - это безопасность.

Это на месте по уважительной причине, это означает, что JS не имеет прямого доступа к вашей файловой системе.

Я предлагаю один из двух обходных решений.

  • Bundle - простой веб-сервер. Например https://stackoverflow.com/questions/530787/simple-http-web-server

  • Изменение AngularJS приложения (и, возможно, $ routeProvider) использовать new File API

  • Это немного Хассель, но скопировать все содержимое шаблона в основной файл в <script type="text/ng-template" id="some-id"></script>

+0

Ограничения проекта не позволяют мне запускать какой-либо веб-сервер. Таким образом, я не могу отключить ограничения безопасности, как в Chrome? В конце концов, он использует веб-набор, поэтому должен быть способ. Как отдельное приложение, я должен иметь полный контроль над веб-представлением/контроллером. И извинения, поскольку я довольно новичок в Flex. – xil3

+0

Я думаю, что ограничение относится к спецификациям JavaScript, а приложение Chrome (а не webkit и/или движок V8 JS) предлагает отказаться от этого конкретного ограничения. Помните, что Chrome и webkit не совпадают. Таким образом, Flex должен предложить аналогичное переопределение, как это делает Chrome. – fredrik

+0

И Flex не предлагает каких-либо настроек? Есть ли другие веб-представления/контроллеры, которые я могу использовать, кроме 'mx: html'? Должны быть некоторые параметры, которые я могу пройти там. Просто кажется настолько ограничивающим. – xil3

0

Кроме того, вы можете попробовать использовать $ http.jsonp вместо $ http.get, хотя вы, возможно, придется изменить angularJS код ....

+0

Это не изменит способ доступа к файлам '$ routeProvider'. – xil3

+0

Я имел в виду, что вы также должны изменить поведение $ routeProvider в AngularJS. Мне пришлось сделать некоторые подобные изменения, чтобы иметь возможность получать шаблон через jsonp. Я знаю, что это не лучший способ, но это единственный, который я нашел, что работает. – Eylen

+0

А, я понимаю, что вы имеете в виду. Проблема в том, что мне придется обновлять AngularJS каждый раз, когда у них есть обновление. Причина, по которой я создаю его как веб-приложение в Flex, заключается в том, что мы можем повторно использовать эту функциональность, когда мы решили перенести ее на действительно веб-платформу. – xil3

2

Если вы еще не сделал это. Попробуйте настроить политику crossdomain для вашего приложения.

Проблема, безусловно, связана с CORS, браузер применяет это ограничение безопасности. В вашем случае браузер является гибким веб-контролем.

Возможно, вам не удастся обойти эту проблему без использования веб-сервера.Когда запрос сделан для файла, политика совместного использования ресурсов Cross Origin не позволяет загружать ресурс без предварительного разрешения от хоста, обслуживающего файл. Эта авторизация поставляется в виде заголовка http, например:

Access-Control-Allow-Origin: *

+0

Да, я пробовал настроить это, но он не работает без веб-сервера, как вы сказали. – xil3

+0

Возможно, вы можете добавить заголовок источника в http-запрос через '$ http.defaults.headers.common [" origin "] = 'somedomain'; ', хотя вам нужно также каким-то образом обмануть« Access-Control-Allow-Origin: * »от ответа на исходный запрос. Однако, это не будет так просто. Могу ли я спросить, почему требование о том, чтобы веб-сервер не использовался? Создание HTTP-запросов для загрузки файлов в javascript нуждается в каком-то веб-сервере, которого нет. Однако это может быть очень простой веб-сервер. Даже вы пишете себя с node.js или каким-то другим языком. –

0

Я считаю, что существует как минимум 2 реализации рендеринга веб-страницы в Flex. Я быстро проверил документы для StageWebView и обнаружил, что схема файла: // uri позволяет локальные XMLHttpRequests (в основном, что делает $ http.get).

+0

Я проверил StageWebView, но ему не хватает функциональности, необходимой для передачи от JavaScript обратно в приложение Flex AIR, и наоборот. – xil3