使用symfony 2将Javascript导入控制器

Javascript into Controller with symfony 2

本文关键字:导入 控制器 Javascript symfony 使用      更新时间:2023-09-26

我试图编码一些java脚本到一个控制器symfony 2。下面的代码是:

    public function indexAction() {
    echo "<script  type='"text/javascript'">"
    . "alert('" test message! '");"
    . "</script>";
    return $this->render('TestBundle:Default:GuiLogin.html.twig');
    }

但不是这个:

    echo "<script  type='"text/javascript'">"
    . "document.getElementById('"DivInfo'").style.display = 'block';"
    . "</script>";

谁知道?

可以先在控制器中定义字符串,然后再在Twig模板中显示它:

h2控制器

public function indexAction() {
    $js = '<script  type="text/javascript">'.
     'document.getElementById("DivInfo").style.display = "block";'.
     '</script>';
    return $this->render(
        'TestBundle:Default:GuiLogin.html.twig',
        array(
            'js' => $js
        )
    );
}
<<h2>枝模板/h2>

将此代码放在</html>标记之前:

<div id="DivInfo" style="display:none;">
    DivInfo
</div>
{% if (js is defined) %}{{ js|raw }}{% endif %}

默认隐藏<div id="DivInfo">,在启用Javascript时显示。

的评论我不明白你的问题背后的逻辑是什么。有几种方法可以仅在某些条件下显示代码。在控制器中定义Javascript函数是一个坏主意,因为将Javascript代码放在.js文件或Twig HTML文件中更合乎逻辑。 <标题>更好的解决方案

根据您的评论,您正在检查用户凭据,因此您可以在控制器中执行测试:

h2控制器

public function indexAction() {
    $message = null;
    if (check credentials)
    {
        $message = 'whatever';
    }
    return $this->render(
        'TestBundle:Default:GuiLogin.html.twig',
        array(
            'message' => $message
        )
    );
}
<<h2>枝模板/h2>
<div id="DivInfo" style="display:none;">
    DivInfo
</div>
{% if ((message is defined) and (message is not null)) %}
    <div>{{ message }}</div>
{% endif %}

好的。首先。你不应该做这样的事。你的控制器动作不应该echo/dump任何东西,除非你正在测试什么。

我的猜测是,第一个例子是有效的,因为alert函数不试图在dom中找到任何元素,浏览器仍然可以执行它。我也相信你的脚本是在呈现方法输出模板之前输出的。这意味着您的脚本在html之前输出,这首先是无效的。第二个例子需要已经加载的html (dom)来根据id查找元素。还可以考虑使用jQuery按id获取元素。当你需要等待加载时,jQuery可以通过选择器和"load"answers"ready"方法来实现。

jQuery - $(document)之间的区别是什么?Ready和$(window).load?

你至少应该把javascript移到模板中。如果必须的话,将javascript放入php变量中并将其传递给模板。然后使用模板引擎(如twig),尝试将该变量输出为html,可能尝试使用原始过滤器或其他一些可以做到的技巧。