与Ember.js和Ecwid的URL片段(#)冲突

Conflict with Ember.js and URL fragment (#) with Ecwid

本文关键字:片段 冲突 URL Ember js Ecwid      更新时间:2023-09-26

我正在使用Ecwid与Ember.js应用程序,我遇到了冲突。简而言之,Ecwid加载了一些将电子商务商店嵌入到页面中的JavaScript。问题是Ecwid和Ember都修改URL片段来跟踪状态,因为Ecwid本质上是它自己的单页面应用程序。基本上,我有两个不同的JS库在争夺URL。

因此,当我使用Ecwid组件时,URL更改为Ecwid URL,并且Ember抱怨Assertion failed: The route !/~/category/id=2104219&offset=0&sort=normal was not found,因为那是Ecwid路由,而不是Ember路由。

我尝试了一条全面的烬路线,但这并没有真正起作用,因为烬状态会随着我所在的页面而变化。

有没有人不得不处理第二个库,与烬在URL上战斗?如果是,您是如何维护状态和处理其他应用程序的?随着pushState和URL片段变得越来越流行,我可以想象这将变得越来越相关。

你真的必须在两者之间做出选择,如果它们都使用url进行某种性质的路由,那么它们都依赖于一些基本url的概念,并且具有不断变化的哈希值。在Ember中,你可以禁用位置路由,但是你会失去Ember的路由能力。

要禁用路由,只需使用NoneLocation

NONELOCATION

使用NoneLocation会导致Ember不存储实际URL中的应用URL状态。这通常用于测试目的,并且是调用时所做的更改之一App.setupForTesting () .

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

我意识到,当我说这个,我部分说谎,因为你可以使用浏览器history代替哈希。所以你的url会变成这样:

/emberHome/fooResource
/emberHome/fooResource/fooBar
不是

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

不幸的是,这有一些主要的缺点,首先你的服务器需要知道在/emberHome服务你的ember应用程序,基本上忽略所有嵌套的位置。其次,浏览器支持是相当新的(http://caniuse.com/history)。第三,不支持识别Ecwid,当转换到不同的路由时,可能会被轰掉。

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

您可以在http://emberjs.com/api/classes/Ember.Location.html#toc_historylocation

阅读更多信息

根据指南,你可以告诉Ember不要使用URL与你的应用程序交互。

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

直接从那里的文档-

最后,如果您不希望浏览器的URL与您的应用程序,你可以完全禁用位置API。这是对测试很有用,或者当你需要用路由器管理状态时,但暂时不希望它与URL混淆(例如当你把你的应用嵌入到一个更大的页面中)。

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