使用 Express Handlebars 和 Angular JS

IT技术 javascript node.js angularjs express handlebars.js
2021-03-12 14:31:00

背景

我目前正在构建一个网站,该网站使用NodeJS作为服务器,Express Handlebars (Just Handlebars but server side),并希望AngularJS用于一些客户端的东西。


问题

AngularJS 和 Handlebars 使用相同的模板语法
{{foo}}
这会导致一个问题,即 AngularJS 代码将首先由 Express Handlebars 解释,然后会抛出错误,因为它试图拉取的数据仅存在于 Angular 而不是 Node 中。


问题

有没有办法让 AngularJS 和 Express Handlebars 一起工作?


可能的解决方案

  • 改变 AngularJS 的语法
    • 我在看 BackboneJS,看起来可以更改语法。可能有类似的东西是 AngularJS。
  • ng在 Express Handlebars 中创建一个助手。
    • 它只会返回其未解析的内容。但是,我无法弄清楚如何做到这一点。
5个回答

您的第一个解决方案是可能的,AngularJS 允许像这样更改文本插值的开始/结束符号:

appModule.config(function($interpolateProvider) {
  $interpolateProvider.startSymbol('{[{');
  $interpolateProvider.endSymbol('}]}');
});

然后你可以在你的模板中使用它:

<div>{[{message}]}</div>

另请参阅:$interpolateProvider 文档

希望这可以帮助。

它对我不起作用。我正在使用他们使用 // 作为新标记的文档。当我这样做时,它只是按原样显示在我的页面上。所以类似于: <h1>Hello //name// </h1> 在页面上显示为 Hello //name//
2021-05-10 14:31:00

您始终可以改用 ng-bind 语法:

<p ng-bind="user.profile.description"></p>
这与
<p>{{user.profile.description}}</p>

来自ngBind的 Angular 文档

通常,您不直接使用 ngBind,而是使用类似 {{ expression }} 的双curl标记,它类似但不那么冗长。

如果模板在 Angular 编译之前以原始状态被浏览器暂时显示,则最好使用 ngBind 而不是 {{ expression }} 。由于 ngBind 是一个元素属性,它使用户在页面加载时不可见绑定。

但是,这条评论的重点不就总结在第一句话中了吗?“通常,您不直接使用 ngBind”。ngBind 旨在用于您遇到模板化内容 (FOUC) 闪现的情况。我会警惕偏离文档建议的内容,这在其建议中似乎非常明确,即仅在这些情况下使用事物。我更喜欢这篇文章的公认答案。
2021-04-25 14:31:00

为了保持 AngularJS 风格,你的第二个解决方案更好,在 Express Handlebars 中创建一个助手。

参考 Handlebars 网站:http : //handlebarsjs.com/block_helpers.html,可以注册一个助手raw-helper

Handlebars.registerHelper('raw-helper', function(options) {
    return options.fn();
});

并在您的 hbs 模板中使用它,将其放入四重存储 {{{{

{{{{raw-helper}}}}
<div class="container" ng-controller="AppCtrl">
    Total Members: {{members.length}}
</div>
{{{{/raw-helper}}}}
我更喜欢这个解决方案。我所做的唯一更改是调用我的助手angular-js - 对我来说{{{{angular-js}}}}更好地解释了它的目的。
2021-04-27 14:31:00
这是一个比公认的更好的解决方案,因为这意味着您不会偏离标准的 Angular 双括号约定(您的 Angular 代码更加module化,可用于其他项目)。
2021-05-04 14:31:00

有一个更好的方法:\{{foo}}。Handlebars 内容可以通过两种方式之一进行转义,内联转义或原始块助手。通过在 mustache 块前加上 \ 来创建内联转义。原始块是使用 {{{{ 小胡子括号创建的。你可以看到这个http://handlebarsjs.com/expressions.html#helpers

我建议使用 AngularJS 的数据绑定语法(看起来类似于 Handlebars)并让您的 NodeJS 服务器只提供静态 AngularJS 源代码。我更喜欢将模板卸载到客户端,从而减轻服务器的压力,更不用说 AngularJS 和其他 MVC 框架(我最喜欢的是 EmberJS)非常适合动态构建网页。

我是Yeoman的粉丝,这里有一个用于构建 NodeJS 服务的 Angular 项目的生成器:https : //github.com/yeoman/generator-angular

我同意 MV* 框架非常适合动态构建网页,但我认为应该编译特定于页面实例的部分。任何可以通过用户交互改变的东西 -> 使用客户端模板。
2021-05-16 14:31:00
另外 - 如果客户端渲染失败会发生什么?最初提供呈现的模板将使您的页面更容易被更广泛的受众访问,更不用说更健壮和容错了。
2021-05-17 14:31:00