我正在使用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路由。
我尝试了一个全能的Ember路线,但这并没有真正起作用,因为Ember状态改变了我正在使用的页面。
有没有人必须处理第二个与Ember争夺URL的图书馆?如果是这样,您是如何维护状态并处理其他应用程序的?随着pushState和URL片段变得越来越流行,我可以想象这将变得越来越相关。
答案 0 :(得分:0)
根据指南,您可以告诉Ember不要使用URL与您的应用程序进行交互。
http://emberjs.com/guides/routing/specifying-the-location-api/
直接从那里的文档 -
最后,如果您不希望浏览器的网址与您的网址进行互动 应用程序,您可以完全禁用位置API。这是 用于测试,或者当您需要使用路由器管理状态时, 但暂时不希望它与URL混淆(例如,何时 您将应用程序嵌入更大的页面中。)
App.Router.reopen({
location: 'none'
});
答案 1 :(得分:0)
你真的必须在两者之间做出选择,如果他们都使用url进行某种性质的路由,那么他们都依赖于某个基本网址的概念,并且会改变哈希值。在Ember中,您可以禁用位置路由,但之后会丢失ember的路由功能。
要停用路由,您只需使用NoneLocation
即可非联盟
使用NoneLocation导致Ember不存储 应用程序实际URL中的URL状态。这通常用于 测试目的,是调用时所做的更改之一 App.setupForTesting()。
App.Router.reopen({
location: 'none'
});
我意识到我正在说这个,我部分说谎,因为你可以使用浏览器history
而不是哈希。所以你的网址就会这样改变:
/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
了解更多相关信息