Sails.js – 如何注入一个js文件到特定的路线?

例如,我有一个页面/locations/map ,我需要包含Google地图库,并且仅包含专门用于此页面的.js文件(例如location.js)

我想把这两个文件注入<!--SCRIPTS END-->这一行之后

是否有可能做到这一点?

注:我正在使用Sails.js v0.10

帆在视图渲染中使用ejs-locals ,所以你可以用块来完成你想要的东西。

在你的layout.ejs文件的<!--SCRIPTS END--> ,添加(例如):

 <%- blocks.localScripts %> 

然后在视图中您正在位于/locations/map ,使用脚本标记调用该块,例如:

 <% block('localScripts', '<script src="https://maps.googleapis.com/maps/api/js"></script>') %> 

或者,您可以将<!--SCRIPTS--><!--SCRIPTS END-->标记放在布局的<head>中,然后将您的视图特定的脚本直接添加到视图中,而不是使用块。 如果您不介意在显示页面内容之前加载链接的脚本,那么这是一个很好的select。

Scott的答案是将非全局JS插入到特定视图中的正确方法。 只是一点点评论,但从视图block调用不应该有破折号 。 应该如下:

<% block('localScripts', '<script src="https://maps.googleapis.com/maps/api/js"></script>') %>

这两个调用都可以工作,但使用短划线会使插入两次; 一旦视图被加载并且在布局渲染之前,然后当视图被插入到渲染的基础布局中时再一次。 这不仅会导致不必要地插入/运行两次相同的代码,而且还会导致插入的脚本依赖于基础布局中的库(例如jQuery,Backbone)而破坏JS代码的错误。

EJS解释魔术<%-为“插入未转义”。 所以, – 我想 – 这是做的是调用block()函数,它返回我们的HTML <script>标记。 这被replace魔术被调用,而且正在执行里面的block()函数,执行布局块localScriptsreplace。

另一方面, <%表示“指令”。 也就是说,只要运行这个JS代码,它不会被回显到被调用的视图。

我发现其他的方式来做到这一点

MapController.js中

 // you can add as many as you like res.locals.scripts = [ '//maps.googleapis.com/maps/api/js', ]; return res.view(); 

layout.ejs中

 <!--SCRIPTS--> <!--SCRIPTS END--> <!-- Loop through all scripts that passed from controller --> <% if (scripts) { %> <% for (i = 0; i < scripts.length; i++) { %> <script src="<%- scripts[i] %>"></script> <% } %> <% } %> 

我知道这是一个古老的问题,我发现了另一种select。

文件:

configuration\ routes.js

码:

 '/': 'HomeController.StartHome' 

我在负责pipe理“/”路由的HomeController中设置了StartHome函数。

文件:

API \控制器\ HomeController.js

码:

 StartHome: function(req, res) { var template_data = { "data" : { "view_name" : "home_view" } } res.view('home_view', template_data) } 

在这里,我创build了一个传递给EJS模板(到客户端)的一些数据的对象。

文件:

意见\ layout.ejs

码:

 <% if (data["view_name"] === "home_view") { %> <script src="script_for_home_view.js"></script> <% } %> 

在我的layouts.ejs中,我创build了if语句,根据当前的视图“启用”脚本标记。

这是我如何处理这个。 我希望你明白。

帆0.12.4

Interesting Posts