0

我试图在我的 Blade 模板中使用一个变量,但我总是得到

ReferenceError:文件未定义

我的理解是,将变量传递给模板的正确方法是这样的(client/ceres.js):

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

(复制自“待办事项”示例)

然后我应该可以在我的模板中使用它,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

结果你也不能包含使用模板变量的文件。即,您不能include在 Blade 中使用该指令根本如果你想在你的模板中使用尚未被 Meteor 初始化的变量——你必须在 DOM 加载后通过 jQuery/JS 插入你的模板。例子:

意见/body.blade:

.container
    h1 Page Title
    #content

视图/文件.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 回答
1

这是 Meteor 的一个已知问题,正在积极处理中。

问题是 Meteor 阻止智能包指定文件的加载顺序。 请参阅此处的问题

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

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

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 回答