Javascript 当使用路由器时,Ember.JS和Ember数据抛出神秘的错误消息

Javascript 当使用路由器时,Ember.JS和Ember数据抛出神秘的错误消息,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,我正在为一个Ember应用程序开发一个已保存的搜索功能,其总体思路是,在执行搜索后,您可以选择输入搜索的短名称,并将其保存到localStorage,然后从下拉列表中检索,同时还能够与其他用户共享当前URL,并让他们看到相同的搜索 这是通过URL中的EmberRouter处理搜索参数和处理用户单击“保存”的视图的组合来实现的(该视图包含在小提琴中,但无法运行,因为不包含任何模板--请参见下文) 无论何时运行应用程序,都会出现以下错误: Uncaught TypeError: Cannot cal

我正在为一个Ember应用程序开发一个已保存的搜索功能,其总体思路是,在执行搜索后,您可以选择输入搜索的短名称,并将其保存到
localStorage
,然后从下拉列表中检索,同时还能够与其他用户共享当前URL,并让他们看到相同的搜索

这是通过URL中的Ember
Router
处理搜索参数和处理用户单击“保存”的视图的组合来实现的(该视图包含在小提琴中,但无法运行,因为不包含任何模板--请参见下文)

无论何时运行应用程序,都会出现以下错误:

Uncaught TypeError: Cannot call method 'set' of undefined 
您可以在下面列出的fiddle中看到跟踪,但是它似乎来自控制器在余烬数据中的存储注入。不幸的是,我对Ember[-data]的了解还不足以了解它与应用程序其余部分的关系

我已经获取了应用程序中应该独立工作的相关部分,并在JSFIDLE中运行它们,但这仍然会导致相同的错误。小提琴位于。目前,没有把手模板或任何东西在小提琴,因为他们没有贡献的问题

在引入路由器之前,
localStorage
适配器和其他部件可以独立工作,因此它可能与现在通过
Checklist.initialize()
运行的代码有关(在添加路由器之前,这是不必要的)


我已经将其与其他类似的项目和示例进行了比较,特别是那些针对余烬数据给出的项目和示例,现在还不完全清楚我在这里做错了什么。我很感激你的洞察力

第一件事:当你用路由器创建应用程序时,你不必创建商店、控制器和视图的实例。调用App.initialize()时,ember将为您执行实例化和注入

然后,您将可以访问:

  • 控制器,通过路由器(在connectOutlets()中),通过router.get(xxxController),其中xxx是例如应用程序(访问基本控制器),或savedSearch访问savedSearchController
  • 通过调用router.get('store'),从路由器获取存储
  • 通过调用this.get('controller')或从带有view.controller的模板从xxxView创建xxxController
  • 通过调用此.get('target'),从控制器中删除路由器

好吧,我让你试着修改代码。当你再次陷入困境时,请告诉我:)

你是否尝试将你的控制器变成一个类?因此,不要使用Checklist.savedSearchController,而是尝试使用Checklist.savedSearchController。

我会帮助您的,但是JSFIDLE现在已关闭:(哈,JSFIDLE的时机不好。不过,它现在似乎又回来了。这就是我的意思,我认为我的意思不够明确。在他的代码中,他有一些类似的问题。我自己在处理您的建议时偶然发现了@tygirl76的解决方案,所以我已将该答案标记为正确的,以供其他人查看。感谢您的帮助,你实际上帮助我将我的许多代码转换为“余烬方式”,而不是使用黑客方法从其他位置获取控制器等。Thx用于+1:)。当你的小提琴准备好时,我希望我可以查看它