2012-10-17 21 views
4

如果处理程序返回变量与模板一起:是否可以在Tornado中基于模板变量运行JavaScript代码?

self.render('page.html', enabled=enabled) 

其中enabled是一个布尔变量。

到目前为止,我知道我可以做这样的事情:在模板的HTML部分中

{% if enabled %} 
    ... 
{% end %} 

但是我们是否可以在Tornado模板中有条件地运行一些基于此enabled变量的JavaScript代码?换句话说,我们可以在嵌入模板的JavaScript中访问这个变量的值吗?

回答

6

当然 - 无论{% if ... %}{ % end %}指令之间的模板内容是否只有在if表达式为True时才会发送到浏览器。因此,任何内容,无论是内嵌JavaScript的<script >标记,还是从某处导入JavaScript文件的<link>标记,都只能通过网络传输。

您甚至可以在Javascript代码本身内部放置一个模板iffor指令,以基于服务器代码已知的条件启用或禁用部分代码。这个,unlinke嵌入或不是一个完整的代码片段,我认为不会被认为是一个好的实践 - 因为它会以不希望的方式纠缠你的代码的服务器端和客户端。

从JavaScript访问变量,只是做:启用

VAR = {{启用}};

{{...}}标记内的值使用服务器变量呈现。

在这种情况下,为保证值enabled是不同的Python和JavaScript兼容的,你应该使用数字0为真(假,1,因为如果你使用Python布尔值,该模板将呈现为 var enabled = True; - 这不是javascript所期待的,因为Javascript中保留的“true”是小写)

唯一的限制是您只能在页面发送到浏览器之前设置服务器端变量。因此,如果您需要在服务器端设置任何取决于用户在所显示页面上的操作的变量,这种做法不会再削减它(仅在页面重新加载时)。使页面交互更新而不重新加载的方式是依赖于来自javascript(以前称为“ajax”)的异步通信。

编辑 - 在OP进一步问:

这里有一个问题:当我返回一个字符串变量如 MYVAR =“富巴”的模板,并在此{{MYVAR }}在JS代码中得到评估 ,JS显然将foo-bar解释为变量名称 而不是字符串。在这种情况下,它会导致错误,因为 - 表示减法。我如何让JS识别foo-bar作为字符串 的值?

再次,这是怎么回事是相当简单:{{ <expr> }}模板操作员将rsulting表达的 字符串表示 - 所以,如果你有蟒蛇 myvar = "bla"和模板var myvar = {{ myvar }},即获取呈现(和发以这种方式到客户端浏览器)为var myvar = bla - bla附近没有引号 - 这就是为什么javascript将其视为变量名。如果它是一个字符串,无论是在Python端还是在模板上,这个变通方法都会在变量中加上额外的引号。

的模板,你可以这样做: var myvar="{{ myvar }}" - 或者,在Python端,定义MYVAR时:myvar = '"%s"' % "bla"

+0

感谢您的回答,但这里有一个问题:当我返回一个字符串,变量'MYVAR ='foo-bar'到模板中,当这个'{{myvar}}'在JS代码中得到评估时,JS显然将'foo-bar'解释为*变量名*而不是*字符串*。在这种情况下,它会导致错误,因为'-'表示减法。我如何让JS将'foo-bar'识别为字符串值? – MLister

相关问题