Конфликт с Ember.js и фрагментом URL (#) с Ecwid

Я использую Эквид с приложением Ember.js и столкнулся с конфликтом. Короче говоря, Эквид загружает код JavaScript, который встраивает на страницу интернет-магазин. Проблема в том, что Ecwid и Ember изменяют фрагмент URL для отслеживания состояния, поскольку Ecwid по своей сути является отдельным одностраничным приложением. По сути, у меня есть две разные библиотеки JS, которые борются за URL-адрес.

Поэтому, когда я использую компонент Эквида, URL-адрес меняется на URL-адрес Эквида, и Ember жалуется на Assertion failed: The route !/~/category/id=2104219&offset=0&sort=normal was not found, потому что это маршрут Эквида, а не маршрут Ember.

Я попробовал универсальный маршрут Ember, но это на самом деле не сработало, потому что состояние Ember меняется в зависимости от страницы, на которой я нахожусь.

Кому-нибудь приходилось иметь дело со второй библиотекой, которая борется с Ember из-за URL-адреса? Если да, то как вы поддерживали состояние и справлялись с другим приложением? Поскольку фрагменты pushState и URL становятся все более и более популярными, я могу себе представить, что это будет становиться все более и более актуальным.


person David Biehl    schedule 29.05.2014    source источник
comment
На самом деле вам придется выбирать между двумя, если они оба используют URL-адрес для маршрутизации какой-либо природы, тогда они оба полагаются на некоторое понятие базового URL-адреса с изменяющимся хэшем. В Ember вы можете отключить маршрутизацию местоположения, но тогда вы потеряете возможности маршрутизации Ember.   -  person Kingpin2k    schedule 30.05.2014
comment
Это то, чего я боялся :/ Ну, в моем случае Ecwid является жестким требованием, поэтому Ember должен уйти :*( Ради ответа, не могли бы вы написать, как включить возможности маршрутизации Ember?   -  person David Biehl    schedule 30.05.2014


Ответы (2)


На самом деле вам придется выбирать между двумя, если они оба используют URL-адрес для маршрутизации какой-либо природы, тогда они оба полагаются на некоторое понятие базового URL-адреса с изменяющимся хэшем. В Ember вы можете отключить маршрутизацию местоположения, но тогда вы потеряете возможности маршрутизации Ember.

Чтобы отключить маршрутизацию, вы просто используете NoneLocation.

НЕРАСПОЛОЖЕНИЕ

Использование NoneLocation приводит к тому, что Ember не сохраняет состояние URL-адреса приложения в фактическом URL-адресе. Обычно это используется в целях тестирования и является одним из изменений, внесенных при вызове App.setupForTesting().

App.Router.reopen({
  location: 'none'
});

Я понимаю, когда говорю это, я частично лгу, потому что вы можете использовать браузер history вместо хеша. Таким образом, ваши URL-адреса просто изменятся следующим образом:

/emberHome/fooResource
/emberHome/fooResource/fooBar

вместо

/emberHome/#/fooResource
/emberHome/#/fooResource/fooBar

К сожалению, у этого есть несколько существенных недостатков, во-первых, ваш сервер должен знать, чтобы обслуживать ваше приложение ember в /emberHome и по существу игнорировать все вложенные местоположения. Во-вторых, поддержка браузера относительно новая (http://caniuse.com/history). В-третьих, поддержка распознавания Эквида поддерживаться не будет и, скорее всего, будет отключена при переходе на другие маршруты.

App.Router.reopen({
  location: 'history'
});

Подробнее об этом можно прочитать на странице http://emberjs.com/api/classes/Ember.Location.html#toc_historylocation

person Kingpin2k    schedule 31.05.2014

Согласно руководствам, вы можете указать Ember не использовать URL-адрес для взаимодействия с вашим приложением.

http://emberjs.com/guides/routing/specifying-the-location-api/

Прямо из документов там -

Наконец, если вы вообще не хотите, чтобы URL-адрес браузера взаимодействовал с вашим приложением, вы можете полностью отключить API определения местоположения. Это полезно для тестирования или когда вам нужно управлять состоянием вашего маршрутизатора, но временно не хотите, чтобы он искажал URL-адрес (например, когда вы встраиваете свое приложение в большую страницу).

App.Router.reopen({
  location: 'none'
});
person ahaurw01    schedule 31.05.2014