我正在尝试在我的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
答案 0 :(得分:1)
事实证明,您不能包含使用模板变量的文件。也就是说,如果你想在模板中使用尚未由Meteor初始化的变量,你就不能在Blade 中使用 - 你必须插入你的在DOM加载后通过jQuery / JS模板。例如:include
指令
<强>视图/ 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智能包以强制执行已编译模板的加载顺序。我为这种困惑道歉。