0

Blade テンプレートで変数を使用しようとしていますが、常に

ReferenceError: ファイルが定義されていません

私の理解では、変数をテンプレートに渡す適切な方法は次のようなものです ( client/ceres.js):

Meteor.startup(function() {
    Files = new Meteor.Collection('files');
    Template['files'].files = function() {
        return Files.find();
    }
});

(「todos」の例からのコピー)

そして、テンプレートでそれを使用できるはずですviews/files.blade:

ul
    foreach files as file
        li= file.filename

しかし、変数がテンプレートに渡されるのが遅すぎると思いますか? しかし、JSを外した場合、Meteor.js定義Templateされていません。

だから私はそれを取得しません。テンプレートが存在しないか、変数が存在せず、常にクラッシュします。単純な変数を渡すにはどうすればよいですか?


これと同じエラー:

ul
    - for(var i=0; i<files.length; ++i)
        li= files[i].filename
4

2 に答える 2

1

これは Meteor の既知の問題であり、積極的に取り組んでいます。

問題は、Meteor がスマート パッケージでファイルのロード順序を指定できないことです。 こちらの問題を参照してください

この問題により、テンプレートが読み込まれる前にクライアント側の JavaScript が実行される可能性があります。(Meteor には、Handlebar テンプレートがカスタム コードの前に確実に読み込まれるようにするハックがあります) たとえば、がまだ定義されていないTemplate.foo.helperName = function() { ... }場合は失敗します。Template.foo

テンプレートが定義される前に、クライアント側の JavaScript コードが読み込まれているかどうかを確認するには、生成された HTML (ソースを表示) をチェックして、最初のページの読み込みを確認します。その場合、次のようなエラーが発生することがあります。

TypeError: Cannot set property 'helperName' of undefined`

この問題を回避するには、クライアント側のコードを別の名前のフォルダーに配置してみてください。Meteor は現在、読み込み順序を決定する際にファイルをアルファベット順にソートしていると思います。詳細については、このページのトラブルシューティングのセクションを参照してください。

同様の回避策は、Meteor.startupビュー ヘルパーをビューに追加するときに利用することです。つまり、自分のTemplate.foo.helperName = ...ものをMeteor.startup呼び出しでラップできます。ただし、テンプレートを使用している場合は、ビュー ヘルパーがセットアップされる前にテンプレートのレンダリングが開始body.bladeされるという逆の問題 (つまり、"catch 22") が発生する可能性があります。body.bladeこの場合、これらのヘルパー/変数がまだ定義されていないため、エラーが発生する可能性があります。ここでの解決策は、テンプレートの使用を避け、すべてのビュー ヘルパーが読み込まれた後 (つまり、ルーチンbody.bladeの最後) にのみ初期テンプレートをレンダリングすることです。Meteor.startup

いずれにせよ、これらの回避策はすべてかなり不十分です。:(しかし、ああ、これらの問題はすぐに修正されるはずです。

Meteor が上記の問題を修正したらすぐに、Blade スマート パッケージを修正して、コンパイルされたテンプレートの読み込み順序を強制します。混乱をお詫び申し上げます。

于 2013-03-21T15:29:59.153 に答える
1

Template 変数を使用するファイルも含めることができないことが判明しました。includeつまり、 Blade ではディレクティブを使用できません。まったくテンプレートで Meteor によってまだ初期化されていない変数を使用する場合は、DOM がロードされた後に jQuery/JS を介してテンプレートを挿入する必要があります。例:

ビュー/body.blade:

.container
    h1 Page Title
    #content

ビュー/files.blade:

ul
    foreach files as file
        - console.log(file);
        li= file.filename

クライアント/main.js:

Files = new Meteor.Collection('files');
Template.files.files = function() {
    return Files.find();
};

$(function() {
    $('#content').html(Meteor.render(Template.files));
});
于 2013-02-10T22:31:50.227 に答える