有没有办法在前端通过Backbone在服务器上呈现Handlebars模板?

时间:2017-02-28 23:59:26

标签: templates backbone.js handlebars.js

编辑

这个问题是以前Handlebars with Backbone template not rendering问题的补充,其中浏览器根本没有渲染表单,现在问题已经解决了表单,但又返回了另一个错误,可能还有渲染。

我在前端有一个带Backbone的应用程序,后端带有Express-Handlebars模板的Express,我试图从Underscore模板改为Handlebars,同时仍然留下了主干逻辑。所以我这样做的方式 - 通过Bower安装把手然后需要它。

  app.ContactView = Backbone.View.extend({
     //....
    template: Handlebars.compile( $('#tmpl-contact').html() ),
     //....
  });

而不是

  app.ContactView = Backbone.View.extend({
     //....
    template: _.template( $('#tmpl-contact').html() ),
     //....
  });

但是它会返回错误,但我并没有真正得到它们的原因。

当我尝试加载页面时,例如:

http://192.168.33.10:3000/contact/

它不会在浏览器中显示任何错误。但如果我转到:

http://192.168.33.10:3000/about

后面甚至没有Backbone逻辑会返回错误:

  

您必须将字符串或Handlebars AST传递给Handlebars.compile。您   通过undefined

这意味着在DOM加载页面之前编译模板。但我的Backbone脚本是在html脚本e之后加载的。 G。在{{{body}}}元素之后。此外,如果订单出现问题,我应该每次都会收到此错误,而不仅仅是在转移到另一个订单时。

所以我认为原因是服务器上的前端把手和快速把手之间存在某种冲突。如何解决这个问题,最好是通过expHbs实例呈现模板?

2 个答案:

答案 0 :(得分:0)

如果您所做的唯一更改是:

template: Handlebars.compile( $('#tmpl-contact').html() ),

为:

template: _.template( $('#tmpl-contact').html() ),

它不会导致你所描述的问题。由于错误消息告诉您“您通过了未定义”,并且undefined也不能使用Underscore代码。

您似乎更有可能改变了其他内容,而且这种更改导致了您所描述的问题。但是,没有更多代码(理想情况下是JS Fiddle),很难说出什么。

答案 1 :(得分:0)

通过将每个Backbone部件作为其路径的单独文件加载来解决问题。