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

时间:2014-05-29 22:46:39

标签: javascript ember.js pushstate

我正在使用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片段变得越来越流行,我可以想象这将变得越来越相关。

2 个答案:

答案 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

了解更多相关信息