Handlebars 将字符串或 Handlebars AST 传递给 Handlebars 编译

Posted

技术标签:

【中文标题】Handlebars 将字符串或 Handlebars AST 传递给 Handlebars 编译【英文标题】:Handlebars Pass a string or Handlebars AST to Handlebars compile 【发布时间】:2014-08-12 19:05:28 【问题描述】:

我知道它被问了很多次,我查看了答案,但不确定我哪里出错了。

我查看了 Handlebarsjs 上的文档并按照教程进行操作,但两次都遇到相同的错误。

<!DOCTYPE html>
<html>
  <head>
     <script src="handlebars-v1.3.0.js"></script>
     <script src="jquery.min.js"></script>
     <script src="test.js"></script>
  </head>
  <body>
    <script id="header" type="text/x-handlebars-template">
      div  headerTitle  div
      Today is weekDay
    </script>
  </body>   
</html>

这是我的 javascript

var theData = headerTitle:"name", weekDay:"monday"
var theTemplateScript = $("#header").html();
var theTemplate = Handlebars.compile(theTemplateScript);
$(document.body).append(theTemplate(theData));

我不断收到以下错误,我不确定为什么

Uncaught Error: You must pass a string or Handlebars AST to Handlebars.compile. 
You passed undefined 

【问题讨论】:

为我工作,jsbin.com/jokulo/1。 【参考方案1】:

在将模板脚本加载到 DOM 之前,您正在运行 Handlebars.compile()。将您的 test.js 移到模板脚本下方,您应该可以开始了。

【讨论】:

这也解决了我的问题。【参考方案2】:

将脚本移动到页面底部也对我有用。

<!DOCTYPE html>
 <html>
   <head>

   </head>
     <body>
        <script id="header" type="text/x-handlebars-template">
            div  headerTitle  div
            Today is weekDay
        </script>

        <script src="handlebars-v1.3.0.js"></script>
        <script src="jquery.min.js"></script>
        <script src="test.js"></script>

   </body>   
 </html>

【讨论】:

【参考方案3】:

正如其他人所说,问题在于您在将 TemplateScript 加载到 DOM 之前运行 Handlebars.compile()

将您的 javascript 调用放入 $(document).ready() 以确保首先加载所有 html。

var theData = headerTitle:"name", weekDay:"monday"

$(document).ready(function()
  var theData = headerTitle:"name", weekDay:"monday"
  var theTemplateScript = $("#header").html();
  var theTemplate = Handlebars.compile(theTemplateScript);
  $(document.body).append(theTemplate(theData));
);

【讨论】:

【参考方案4】:

在我的情况下,我遇到了同样的错误,但问题是 html 页面中的模板脚本中的错字。我的“产品模板”应该是“产品模板”:

    <script id="prouct-template" type="text/x-handlebars-template">
    ...
    </script>

一旦我修正了错字,错误就消失了,页面加载正常。

【讨论】:

【参考方案5】:

需要对 JavaScript 文件进行一些修改。我遇到过同样的问题。在我的代码中,我从 Views 中调用了“handlebars”(以下解释是关于视图的)。

在 View 的初始化函数(init)中包含以下内容:

theTemplate = Handlebars.compile(theTemplateScript);

在渲染中写下剩下的代码:

var theTemplate = Handlebars.compile(theTemplateScript); $(document.body).append(theTemplate(theData));

正确的做法是预编译Handler,存储在文件中,然后赋值给theTemplate

【讨论】:

【参考方案6】:

在我的情况下,我试图为更深层次的步骤分配一些价值,因此,我遇到了错误。

在我的代码之前

app.use(function (req, res, next) res.locals.partials.weather = ; = getWeatherData(); next(); );

问题是

res.locals.partials.weather

移除层后部分我的问题消失了。

最后的代码是

app.use(function (req, res, next) res.locals.weather = getWeatherData(); next(); );

【讨论】:

【参考方案7】:

您在模板脚本加载之前使用Handlebars.compile()。一个简单的技巧将为您完成工作。在您的脚本中使用defer 标记,以便在脚本在您的&lt;head&gt; 标记中运行之前加载整个正文。

<head>
<script src="" defer> </script>
</head>

【讨论】:

以上是关于Handlebars 将字符串或 Handlebars AST 传递给 Handlebars 编译的主要内容,如果未能解决你的问题,请参考以下文章

在 Handlebars.js 辅助参数中连接字符串和变量的合理方法?

将 someVar+'a string' 传递给 Handlebars.js 助手?

handlebars的使用方法

handlebars 遍历数组判断是不是含有字符

在 Meteor 中的字符串数组上使用 Handlebars #each 进行迭代

渲染 Marionette/Backbone 视图时将变量传递到 Handlebars 模板