2016-10-14 2 views
0

私はこのUI.registerHelperを作った:「定義されていません」というエラーが表示されるのはなぜですか?コードはMeteorテンプレートで機能していますか?

UI.registerHelper('addressCityName', function(id) { 
    "use strict"; 
     return Cities.findOne({_id: id }).name 
}) 

これは私が私のアドレスコレクションにリンクされcity IDのnameプロパティにアクセスすることができます。

これはブラウザでは機能しますが、コンソールではException in template helper: TypeError: Cannot read property 'name' of undefinedというエラーが表示されます。

UI.registerHelperの戻り値からnameプロパティを削除した場合、エラーはなくなりますが、ブラウザには都市名が表示されなくなります。

これまでは何でしたが、どうすれば修正できますか?

enter image description here

+0

都市コレクションがまだ準備されていないためですか? – webmagnets

+1

Probsヘルパーが初めて実行されたときにサブスクリプションが準備できていないため、ブロックを '{{#if Template.subscriptionsReady}} ... {{if/if}} 'でラッピングしてみてください。サブスクリプションが完了しました – rubie

+0

それは動作しませんでした。エラーは同じです。 – webmagnets

答えて

1

Cities.findOne({_id: id }).nameを使用して名前を取得しようとすると。しかし、あなたのサブスクリプションはクライアント側で準備ができていませんでした従って、Cities.findOne({_id: id })の出力は未定義です。

したがって、Cities.findOne({_id: id }).nameを取得しようとすると、出力を視覚化するとundefined.nameのようになります。これが原因でエラーが発生しています。

問題を解決するには、条件を追加して問題を解決します。

UI.registerHelper('addressCityName', function(id) { 
    "use strict"; 
     if(Cities.findOne({_id: id })) { 
      return Cities.findOne({_id: id }).name 
     } 
}) 
+0

さて、htmlに名前が表示されているので、if文が返ることはわかっています。 – webmagnets

+0

@webmagnetsヘルパーは複数回実行され、再実行されることに注意してください。問題は、初めて実行したときにサブスクリプションが準備できていないため、TypeErrorが発生することです。サブスクリプションが準備完了すると、ヘルパーが再び実行され、正常に返されます。だからここでやっているのは、初期のTypeErrorを避けることだけです。 – rubie

+0

ありがとうございます。しかし、私はifステートメントを追加しましたが、私はまだ同じエラーが発生します。 – webmagnets

0

すべてのオブジェクトが名前のプロパティを持っているかどうかを確認するためにあなたの前にreturnnameプロパティをconsole.log(Cities.findOne(..))を試してみてください?

私はこのような問題を抱えているとき、私は意図せずに、私が意図しない別のオブジェクトを思いがけず返すためです。

+0

私はあなたの提案でそれを試しました。正しい名前が印刷されます。 – webmagnets

関連する問題