Meteor + Blade模板变量捕获22

时间:2013-02-10 21:03:37

标签: meteor node-blade

我正在尝试在我的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

但我猜这个变量传给模板的时间太晚了?但如果我从Meteor.js中取出我的JS,则Template未定义。

所以我没理解。我的模板不存在,或者变量不存在,并且它总是崩溃。如何传递一个简单的变量?


与此相同的错误:

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

2 个答案:

答案 0 :(得分:1)

事实证明,您不能包含使用模板变量的文件。也就是说,如果你想在模板中使用尚未由Meteor初始化的变量,你就不能在Blade 中使用include指令 - 你必须插入你的在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));
});

答案 1 :(得分:1)

这是Meteor的一个已知问题,正在积极开展工作。

问题在于Meteor阻止智能包指定文件的加载顺序。 See issue here

由于此问题,您的客户端JavaScript可能会在加载模板之前运行。 (Meteor中有一个黑客可以确保在自定义代码之前加载Handlebars模板)例如,如果尚未定义Template.foo.helperName = function() { ... }Template.foo将失败。

检查生成的HTML(查看源代码)以获取初始页面加载,以查看在定义模板之前是否加载了客户端JavaScript代码。如果是这样,您可能会收到如下错误:

TypeError: Cannot set property 'helperName' of undefined`

要解决此问题,请尝试将客户端代码放在具有不同名称的文件夹中。我相信Meteor目前在确定加载顺序时按字母顺序对文件进行排序。有关详情,请参阅this page上的问题排查部分。

类似的解决方法是在向视图添加视图帮助程序时使用Meteor.startup。也就是说,您可以将Template.foo.helperName = ...内容包裹在Meteor.startup来电中。但是,如果您使用的是body.blade模板,则最终可能会遇到相反的问题(即“catch 22”),其中body.blade模板在视图助手设置之前开始渲染。在这种情况下,您可能会收到错误,因为尚未定义这些帮助程序/变量。这里的解决方案是避免使用body.blade模板,并且只有在加载了所有视图助手后(即在Meteor.startup例程的末尾)才渲染初始模板。

无论如何,所有这些变通办法都相当蹩脚。 :(但是,唉!这些问题应尽快解决。

一旦Meteor修复了上述问题,我将修改Blade智能包以强制执行已编译模板的加载顺序。我为这种困惑道歉。