首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将变量从jade模板文件传递到脚本文件?

如何将变量从jade模板文件传递到脚本文件?
EN

Stack Overflow用户
提问于 2012-01-02 15:46:29
回答 3查看 124.7K关注 0票数 125

在jade模板文件(index.jade)中声明的变量(config)没有传递给javascript文件时遇到了问题,这会使我的javascript崩溃。下面是文件(views/index.jade):

代码语言:javascript
复制
h1 #{title}

script(src='./socket.io/socket.io.js')
script(type='text/javascript')
  var config = {};
  config.address = '#{address}';
  config.port = '#{port}';
script(src='./javascripts/app.js')

下面是我的app.js (服务器端)的一部分:

代码语言:javascript
复制
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.set('address', 'localhost');
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

// Routes

app.get('/', function(req, res){
  res.render('index', {
    address: app.settings.address,
    port: app.settings.port
});
});

if (!module.parent) {
  app.listen(app.settings.port);
  console.log("Server listening on port %d",
app.settings.port);
}

// Start my Socket.io app and pass in the socket
require('./socketapp').start(io.listen(app));

下面是我的javascript文件崩溃的一部分(public/javascripts/app.js):

代码语言:javascript
复制
(function() {
        var socket = new io.Socket(config.address, {port: config.port, rememberTransport: false});

我在本地主机(我自己的机器)上以开发模式(NODE_ENV=development)运行站点。我使用node-inspector进行调试,它告诉我在public/javascripts/app.js中没有定义config变量。

有什么想法吗?谢谢!!

EN

回答 3

Stack Overflow用户

发布于 2018-05-12 10:57:04

在我的例子中,我试图通过快速路由将一个对象传递到模板中(类似于操作设置)。然后,我希望将该对象传递给一个函数,该函数是通过pug模板中的脚本标记调用的。尽管lagginreflex's answer让我离得很近,但我最终得到了以下结果:

代码语言:javascript
复制
script.
    var data = JSON.parse('!{JSON.stringify(routeObj)}');
    funcName(data)

这确保了对象按预期传入,而不是需要在函数中反序列化。此外,其他答案似乎也适用于原语,但当数组等与对象一起传递时,它们被解析为字符串值。

票数 12
EN

Stack Overflow用户

发布于 2018-09-05 20:51:31

如果您像我一样经常使用这种传递变量的方法,那么这里有一个编写更少代码的解决方案。

在node.js路径中,在名为window的对象中传递变量,如下所示:

代码语言:javascript
复制
router.get('/', function (req, res, next) {
    res.render('index', {
        window: {
            instance: instance
        }
    });
});

然后在您的pug/jade布局文件中(就在block content之前),像这样将它们取出:

代码语言:javascript
复制
if window
    each object, key in window
        script.
            window.!{key} = !{JSON.stringify(object)};

因为每个pug文件都加载了我的layout.pug文件,所以我不需要一遍又一遍地“导入”我的变量。

这样,传递给window的所有变量/对象都会“神奇”地在浏览器的真正window对象中结束,您可以在Reactjs、Angular等应用程序中使用它们。或者vanilla javascript。

票数 7
EN

Stack Overflow用户

发布于 2012-01-04 02:27:57

请看这个问题:JADE + EXPRESS: Iterating over object in inline JS code (client-side)?

我也有同样的问题。Jade不会将本地变量传递给javascript脚本(或者根本不做任何模板操作),它只是将整个代码块作为文字文本传递。如果您在Jade文件中的script标记上方使用了本地变量'address‘和'port’,它们应该会显示出来。

我在上面链接的问题中列出了可能的解决方案,但您可以:-将每行作为未转义的文本传递(!=在每行的开头),并简单地将"-“放在使用局部变量的javascript的每一行之前,或者:-通过dom元素传递变量并通过JQuery访问(丑陋)

没有更好的方法了吗?Jade的创建者似乎不想要多行javascript支持,如GitHub:https://github.com/visionmedia/jade/pull/405中的线程所示

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8698534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档