web-dev-qa-db-ja.com

Meteorで「テンプレートが定義されていません」の原因は何ですか?

この非常に単純なMeteorアプリは、ロード時にTemplate is not definedエラーをスローします。このアプリは基本的にボイラープレートプロジェクト(meteor create)と同じで、サーバー/クライアント/パブリックディレクトリに分割されています。

Meteorは、グローバルTemplateオブジェクトが実際に準備される前に、Handlebars templateタグをレンダリングしようとしているようです。 JSコンソールにアクセスして「テンプレート」と入力できるようになるまでに、そこにあります。

私は何か間違ったことをしましたか、それともこれはタイミングのバグですか?

22
mwcz

うーん、おそらくこれはあなたの問題を解決するでしょう:

Bodyタグにはテンプレート名が含まれていますが、テンプレートは含まれていないことに注意してください。

<body>
  {{> hello}}
</body>

<template name="hello">
  {{greet}}
</template>

また、「。greet」は{{greet}}を指すことに注意してください。

if (Meteor.isClient) {
  Template.hello.greet = function () {
    return "Hey!";
  };
}

そのため、問題は、ボディ内にテンプレートを含めることができないということでした。代わりに、本文は上記のコードのように{{> hello}}を使用してテンプレートを呼び出します。

9
randompast

テンプレートを呼び出す.jsファイルがif (Meteor.isClient){}でラップされていることを確認する必要があります。そうしないと、何らかの理由でTemplateグローバル変数が使用できなくなります。

27
KJW

これがパッケージに含まれている場合は、API使用リストでテンプレートを作成していることを確認してください。

api.use( 'テンプレート'、 'クライアント');

これにより、Templateオブジェクトがインスタンス化されると、コードが確実に実行されます。

5
Joe

これは初期化の問題です。 Meteor 1.0を使用しており、Meteor.startup(function () {}またはifブロックをMeteor.isClientに追加することで問題を解決しました。

特別なディレクトリのドキュメントには以下のように記載されているため、これはバグである可能性があります(本日現在)。

クライアント:clientという名前のディレクトリはサーバーにロードされません。 if(Meteor.isClient){...}でコードをラップするのと似ています。クライアントにロードされたすべてのファイルは、本番モードのときに自動的に連結および縮小されます。開発モードでは、デバッグを容易にするために、各ファイルが個別に送信されます。 MeteorアプリケーションのHTMLファイルは、サーバー側のフレームワークとはかなり異なる方法で処理されます。 Meteorは、ディレクトリ内のすべてのHTMLファイルをスキャンして、<head><body>、および<template>の3つのトップレベル要素を探します。ヘッドセクションとボディセクションは別々に連結されて単一のヘッドとボディになり、最初のページの読み込み時にクライアントに送信されます。

しかし、初期化しないと、これは「テンプレートが見つかりませんエラー」で失敗します。

Template.hello.thisを試して、データを{{this}}に渡します

0
ivac