Meteor+Blade模板变量catch 22



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

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

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

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

检查生成的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智能包,以强制执行编译模板的加载顺序。我对造成的混乱表示歉意。

事实证明,您也不能包含使用Template变量的文件。也就是说,如果你想在你的模板中使用尚未被Meteor初始化的变量,你根本不能在Blade

中使用include指令——你必须在DOM加载后通过jQuery/JS插入你的模板。示例:

views/body.blade:

.container
    h1 Page Title
    #content

视图/文件。刀片:

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

client/main.js:

Files = new Meteor.Collection('files');
Template.files.files = function() {
    return Files.find();
};
$(function() {
    $('#content').html(Meteor.render(Template.files));
});

最新更新