无法访问javascript中通过twig传递的实体数组

时间:2015-02-06 10:30:21

标签: javascript symfony twig

我目前正在研究symfony2.0项目。目前我被困在某个地方,我想在我的twig文件中使用一些简单的javascript。

从我的控制器中,我将一个名为Machine的实体数组传递给twig文件,如下所示:

 ...
return $this->render('PRwissHostsBundle:mini:editLocation.html.twig',
       array(
         'form' => $form->createView(), 'id' => $id, 'machines' => $machinesInLoc, 
       ));

我在twig文件中的表单很容易访问machines数组。我现在需要的是在javascript中访问这个数组。

目前,我正在这样做:

<script type="text/javascript">
    ...
    var mach_array = {{machines|json_encode|raw}};
    var machine = mach_array[0];
    alert(machine.name);
    ....
</script>

不知怎的,如果我提醒mach_array它说它是一个对象。当我提醒machine时,结果相同。什么是不可能的是访问机器ID或名称或whatevers属性。

我已经搜索过其他几个问题,例如this但不幸的是,他们对一系列实体没有帮助。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

一般情况下,除非绝对必要,否则不应让Twig处理数据格式化,例如作为AJAX调用的响应。

话虽如此,你的问题在于你如何声明mach_array。

var mach_array = {{machines|json_encode|raw}};

应该是

var mach_array = '{{machines|json_encode|raw}}';

通过不将调用包装到twig,Javascript将使mach_array成为一个Object,它与

相同
var mach_array = {"foo" : "bar"}

解析为Object。

答案 1 :(得分:0)

所以我在Nihilnovi的帮助下解决了我的问题。问题不像gregory所说的空数组,我只是没有真正弄清楚如何正确使用javascript和twig实体。现在,工作代码如下所示:

<script type="text/javascript">
function report(period){
  var e = document.getElementById("form_machines");
  var selectValue = e.options[e.selectedIndex].value;
  var selectText  = e.options[e.selectedIndex].text;
  if (selectValue != ""){
    var table = document.getElementById("uebersicht");
    var row = table.insertRow(-1);
    var cell1 = row.insertCell(0);
    var cell2 = row.insertCell(1);
    var cell3 = row.insertCell(2);
    cell1.innerHTML = "<b>Name:</b>";
    var mach_array = {{machinesAvailable|json_encode|raw}};        

    {% for machine in machinesAvailable %}
      if ({{machine.name|json_encode|raw}}  == selectText){
       cell2.innerHTML = "<a href='{{ url('PRwissHostsBundle_det_machine', { 'id':machine.id }) }}'> {{machine.name}} </a>";
      }
    {% endfor %}

    cell3.setAttribute('align', 'right');
    cell3.innerHTML = "<input type='checkbox' id=machine.id >";
  }
}


</script>

希望这可以帮助一些处理相同问题的人!