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()
函数,执行布局块localScripts
replace。
另一方面, <%
表示“指令”。 也就是说,只要运行这个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