【问题标题】:Meteor+Blade template variables catch 22Meteor+Blade 模板变量 catch 22
【发布时间】:2023-03-05 09:00:01
【问题描述】:

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

【问题讨论】:

  • 如果您尝试过foreach Files.find() as file 有帮助吗?
  • @Akshat:不,它没有。 .find() 应该已经通过我的客户端 JS 应用了,但无论如何,files 变量本身并不存在,因此向它添加属性不会有帮助。不过,我试了一下,错误确实是一样的:“ReferenceError: files is not defined”
  • 我的意思是因为带有大写字母的文件是对集合的引用,我知道使用 Template.files.files = function().. 适用于车把,但如果可以的话,对于刀片可能会有所不同只需在刀片模板中运行 js
  • @Akshat:哎呀!我没看到大写的F。它也不识别Files
  • 这似乎是一个更常见的问题,看看stackoverflow.com/questions/13207015/using-bladejs-with-meteor

标签: meteor node-blade


【解决方案1】:

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

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

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

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

【讨论】:

  • 我很高兴它正在处理中。感谢您的帮助(以及 Blade 本身!)。然而,在 Meteor 中解决包含排序之前,我认为这不是一个合适的解决方案。我不应该按字母顺序命名我的文件。
  • @Mark - 同意 - 重命名文件是一个蹩脚的解决方法。我一直在推动 Meteor 团队,但他们是一个非常忙碌的团队。 :)
  • 另一种解决方法是在向视图添加视图助手时使用Meteor.startup。也就是说,您可以将您的 Template.foo.helperName = ... 内容包装在 Meteor.startup 调用中。
【解决方案2】:

原来你也不能包含使用模板变量的文件。即,如果您想在模板中使用尚未由 Meteor 初始化的变量,则不能在 Blade at all 中使用 include 指令——您必须通过插入模板DOM 加载后的 jQuery/JS。示例:

views/body.blade:

.container
    h1 Page Title
    #content

views/files.blade:

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));
});

【讨论】:

  • 这应该不再是这种情况。 include 现在应该可以在 Blade 3.0.3 中正常工作了。
  • 您可能需要修改/删除上面的答案,因为它与手头的问题无关。此外,我很确定 includes 在最近的一些错误修复之后可以正常工作。如果没有,请告诉我。谢谢!
  • 人力资源管理?怎么没有关系?问题是我不能在 Blade 模板中使用变量;这是一种解决方法。在您的回答中,您说只有以正确的顺序包含文件(目前由文件名控制),它才会起作用,这也不是真正的“修复”,是吗?
  • 啊,我想我现在明白了。答案让我很困惑,因为“也就是说,你根本不能在 Blade 中使用 include 指令”
  • @BMiner:哦..我应该改变一下措辞。但是,如果没有变量,include 指令就不是很有用 :-) 这不是你的错,我们只需要等到 Meteor 人员找出处理这种情况的最佳方法。
猜你喜欢
  • 2014-05-06
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2015-07-16
相关资源
最近更新 更多