2012-07-30 36 views
1

我正在为Ember应用程序保存的搜索功能,一般的想法是,进行搜索后,您可以选择输入短名称搜索并将其保存到localStorage,并在稍后从下拉列表中检索它,同时还可以与其他用户共享当前URL并让他们看到相同的搜索。Ember.JS和余烬数据使用路由器时抛出隐晦的错误消息

这可以通过处理URL中的搜索参数Ember Router和处理用户单击'保存'的视图的组合来实现(视图包含在小提琴中,但无法运行,因为没有模板包括 - 见下文)。

每当我运行应用程序,我得到以下错误:

Uncaught TypeError: Cannot call method 'set' of undefined 

你可以看到在下面列出的小提琴的痕迹,但它似乎从控制器店注射烬数据来干。不幸的是,我对Ember [-data]的知识不够深入,无法知道这与应用程序的其余部分有何关系。

我已经采取了独立工作的应用程序的相关部分,并在JSFiddle中运行它们,但仍导致相同的错误。小提琴位于http://jsfiddle.net/fetcU/。目前没有句柄模板或其他东西,因为它们不会导致问题。

localStorage适配器和其他部件独立工作,直到路由器被引入,所以它可能与现在正在运行的代码Checklist.initialize()(直到添加路由器时不需要)相关。

我已经将它与其他类似的项目和示例进行了比较,特别是那些为ember-data给出的示例,并且我不完全清楚我在这里做了什么错误。我会很感激任何见解!

+0

我会帮助你,但的jsfiddle是失望吧:( – 2012-07-30 12:55:28

+0

哈,从的jsfiddle坏时机。这似乎是回到了现在,但是。 – 2012-07-30 13:23:20

回答

0

你有没有尝试让你的控制器上课?因此,而不是Checklist.savedSearchController,请尝试Checklist.SavedSearchController。

+0

这就是我的意思,我想我没有足够明确。在他的代码中,他有这样的问题 – 2012-07-30 19:43:26

3

第一件事:当您使用路由器创建应用程序时,您不必创建Store,Controllers和Views的实例。当调用App.initialize()时,ember会为你做实例化和注入。

然后,你将有机会:

  • 控制器,经由路由器(在connectOutlets()),由router.get(xxxController),其中xxx是例如应用(以访问基本控制器)或savedSearch访问您的savedSearchController。
  • 商店,从路由器通过通过调用this.get(“控制器”),或从模板与调用router.get(“存储”),从一个xxxView
  • 一个xxxController view.controller
  • 的路由器通过调用this.get('target')

嗯,我让你尝试修改代码。让我现在当你再次卡住:)

+0

我碰到@ tygirl76的解决方案来小心自己,同时您的建议摆弄,所以我已经标记出这个答案对其他人来说是正确的。感谢您的帮助,您实际上帮助我将大量代码转换为“烬路”,而不是使用hacky方法从其他位置获取控制器等。 – 2012-08-01 07:49:51

+0

Thx为+1 :)。当你的小提琴准备好了,我希望我可以查看它 – 2012-08-01 08:07:07