使用Express Handlebars和Angular JS

时间:2014-08-18 15:02:47

标签: javascript node.js angularjs express handlebars.js

背景

我目前正在构建一个使用NodeJS作为服务器的网站,Express Handlebars(仅Handlebars,但服务器端),并希望AngularJS用于某些客户端。


问题

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


问题

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


可能的解决方案

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

5 个答案:

答案 0 :(得分:70)

你的第一个解决方案是可能的,AngularJS允许更改文本插值的开始/结束符号,如下所示:

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

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

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

另见:$interpolateProvider documentation

希望这有帮助。

答案 1 :(得分:18)

您总是可以使用ng-bind语法:

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

来自ngBind的Angular文档:

  

通常情况下,您不能直接使用ngBind,而是使用像{{expression}}这样的双重卷标,它类似但不那么冗长。

     

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

答案 2 :(得分:14)

为了维持AngularJS Style,你的第二个解决方案更好,在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}}}}

答案 3 :(得分:11)

有一种更好的方式:\ {{foo}}。 车把内容可以通过两种方式之一进行转义:内联逃生或原始帮助。通过使用\前缀胡子块创建的内联转义。使用{{{{mustache braces。您可以看到此http://handlebarsjs.com/expressions.html#helpers

答案 4 :(得分:9)

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

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