1

私はEmberアプリケーションの保存済み検索機能に取り組んでいます。一般的な考え方は、検索を実行した後、検索の短縮名を入力して保存し、localStorage後でドロップダウンリストから取得するオプションがあるということです。現在のURLを他のユーザーと共有し、同じ検索を表示させることができます。

これは、URLの検索パラメータを処理するEmberRouterと、ユーザーが「保存」をクリックするのを処理するビューの組み合わせによって機能します(ビューはフィドルに含まれていますが、テンプレートが含まれていないため実行できません-以下を参照してください)。

アプリケーションを実行するたびに、次のエラーが発生します。

Uncaught TypeError: Cannot call method 'set' of undefined 

以下にリストされているフィドルでトレースを見ることができますが、それはember-dataのコントローラーストアインジェクションに由来しているように見えます。残念ながら、Ember [-data]に関する私の知識は、これがアプリケーションの他の部分とどのように関連しているかを知るには十分ではありません。

独立して動作するはずのアプリケーションの関連部分を取得し、JSFiddleで実行しましたが、それでも同じエラーが発生します。フィドルはhttp://jsfiddle.net/fetcU/にあります。現在、ハンドルバーテンプレートなどは問題の原因ではないため、そのフィドルには何もありません。

localStorageルーターが導入されるまで、アダプターとその他の部分は独立して正常に機能していたため、現在実行されているコードに関連している可能性があります(Checklist.initialize()ルーターが追加されるまでは必要ありませんでした)。

私はこれを他の同様のプロジェクトや例、特にember-dataに与えられたものと比較しましたが、ここで何が間違っているのかが完全には明らかではありません。洞察をいただければ幸いです。

4

2 に答える 2

3

まず、ルーターを使用してアプリを作成する場合、ストア、コントローラー、ビューのインスタンスを作成する必要はありません。App.initialize()を呼び出すと、emberがインスタンス化とインジェクションを行います。

次に、アクセスできるようになります。

  • コントローラー、ルーター経由(connectOutlets()内)、router.get(xxxController)、ここでxxxは、たとえばアプリケーション(ベースコントローラーにアクセスするため)、またはsavedSearchを使用してsavedSearchControllerにアクセスします。
  • router.get('store')を呼び出してルーターからストア
  • this.get('controller')を呼び出してxxxViewから、またはview.controllerを使用してテンプレートからxxxController
  • this.get('target')を呼び出すことにより、コントローラーからルーター

さて、コードを変更してみましょう。あなたが再び立ち往生しているときに今私にさせてください:)

于 2012-07-30T13:51:48.397 に答える
0

コントローラをクラスにしてみましたか?したがって、Checklist.savedSearchControllerの代わりに、Checklist.SavedSearchControllerを試してください。

于 2012-07-30T17:33:47.813 に答える