在Symfony 3.0上使用twig生成Javascript,而不干扰Javascript代码中的{}

在Symfony 3.0上使用twig生成Javascript,而不干扰Javascript代码中的{},javascript,php,requirejs,twig,symfony,Javascript,Php,Requirejs,Twig,Symfony,我尝试生成一种方法,通过使用twig的路径函数可以获得每个ajax调用的URL。我之所以这样做,是因为我试图通过使用Knockout MVVM和require.js创建一个单页应用程序,因此我需要Ajax调用,需要动态生成URL 我这样做的方式是创建一条路线: /** *@Route("/ajax.js",name="ajax_calls") */ public function ajax_calls(Request $request) { $response=$th

我尝试生成一种方法,通过使用twig的路径函数可以获得每个ajax调用的URL。我之所以这样做,是因为我试图通过使用Knockout MVVM和require.js创建一个单页应用程序,因此我需要Ajax调用,需要动态生成URL

我这样做的方式是创建一条路线:

  /**
  *@Route("/ajax.js",name="ajax_calls")
  */
  public function ajax_calls(Request $request)
  {
    $response=$this->render('javascript/ajax_calls.js.twig');
    $response->headers->set('Content-Type', 'application/javascript');

    return $response;
  }
然后我加载特定的模板(javascript/ajax_calls.js.twig):

我使用fefine是因为我希望能够加载require.js,正如您所看到的,我尝试生成一个对象,该对象返回单页应用程序特定部分的URL

但不知怎么在网上:

    'albums':{
这是一场冲突,我不知道如何逃避

我得到的具体错误是:

Arguments must be separated by a comma. Unexpected token "punctuation" of value ":" ("punctuation" expected with value ",") in main.js.twig at line 11. 
您知道如何解决这个问题,或者知道另一种将URL作为Javascript对象获取(通过动态生成)的方法吗

注意:我还看到了发布在

但它对我如何设计应用程序没有帮助(我使用视图模型,我希望尽可能从URL中保持视图模型的清晰,并从外部加载它们)

同时,我也将以另一种方式毕业


编辑1: 我试过:

/**
*Returns the urls of the calls we need
*/
define([],function($)
{

  return {
    /**
    *Urls for the albums (aka image groups)
    */
    'albums': {% verbatim %} { {% endverbatim %}
              'get':function()
{% verbatim %}   { {% endverbatim %}
                return "{{path('user_groups')}}";
               },
               'add':function()
               {% verbatim %} { {% endverbatim %}
                 return "{{path('group_add')}}";
               }
               'delete':function()
               {% verbatim %} { {% endverbatim %}
                   return "{{path('group_delete')}}";
               }
               'edit':function()
               {% verbatim %} { {% endverbatim %}
                 return "{{path('group_update')}}";
               }
              },
    /**
    *Urls for the Images
    */
    'images': {% verbatim %} { {% endverbatim %}
              'add':function(group_id)
              {% verbatim %} { {% endverbatim %}
                return "{{path('add_images', group_id='^group_id^')}}".replace("^group_id^",group_id);
              },
              'delete':function()
              {% verbatim %} { {% endverbatim %}
                return "{{path('delete_images')}}";
              }
             }
  };
});
并返回错误:

Arguments must be separated by a comma. Unexpected token "punctuation" of value ":" ("punctuation" expected with value ",") in main.js.twig at line 11. 

编辑2: 我也得到了同样的错误:

{% verbatim %}
/**
*Returns the urls of the calls we need
*/
define([],function($)
{

  return {
    /**
    *Urls for the albums (aka image groups)
    */
    'albums':{
{% endverbatim %}
              'get':function()
               {
                return "{{path('user_groups')}}";
               },
               'add':function()
               {
                 return "{{path('group_add')}}";
               }
               'delete':function()
               {
                   return "{{path('group_delete')}}";
               }
               'edit':function()
               {
                 return "{{path('group_update')}}";
               }
{% verbatim %}
              },
    /**
    *Urls for the Images
    */
    'images':{
{% endverbatim %}
              'add':function(group_id)
              {
                return "{{path('add_images', group_id='^group_id^')}}".replace("^group_id^",group_id);
              },
              'delete':function()
              {
                return "{{path('delete_images')}}";
              }
{% verbatim %}
             }
  };
});
{% endverbatim %}

编辑3: 我发现我生成了另一个javascript文件。控制器使用main.js.twig生成它:

requirejs.config({
  baseUrl:'{{asset('')}}',
  paths:{
    'text':'assets/vendor/js/text.min',

    'knockout':["https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min",'assets/vendor/js/knockout.min'],
    'pager':"{{asset('assets/vendor/js/pager.min')}}",
    'jquery':"{{asset('assets/vendor/js/jquery.min')}}",
    'boostrap':"{{asset('assets/vendor/js/bootstrap.min')}}",

    'ajax':"{{path('ajax_calls')|replace('.js':'')}}",

    {% block Viewmodels %}
    {% endblock %}

    'compMessage':'assets/js/components/message',
    'extBooleanToggle':'assets/js/extenders/booleanToggle',
  },
  shim:{
    'pager':['knockout'],
    'bootstrap':['jquery'],
    },
  waitSeconds: 200,
});

{% block initFunction %}
{% endblock %}
产生的问题是线路:

'ajax':"{{path('ajax_calls')|replace('.js':'')}}",
'ajax':"{{path('ajax_calls')|replace('.js':'')}}",

在这一行中,我尝试生成一个不带.js的“伪”.js文件,以便要求.js使用.js扩展名加载它。

如果这确实是您的代码。。。您缺少两个逗号,一个在添加方法之后,另一个在删除方法之后:

{
    'get': function ()
    {
        return "{{path('user_groups')}}";
    },
    'add': function ()
    {
        return "{{path('group_add')}}";
    },
    'delete': function ()
    {
        return "{{path('group_delete')}}";
    },
    'edit': function ()
    {
        return "{{path('group_update')}}";
    }
}
我想这根本不是一个与树枝有关的问题。

我换了行:

'ajax':"{{path('ajax_calls')|replace('.js':'')}}",
'ajax':"{{path('ajax_calls')|replace('.js':'')}}",
与:


在main.js.twig上,像魅力一样工作

您是否尝试在
相册:
{
之间添加空格?它将是
相册:{
而不是
相册:{
。虽然不应该完全满足您的需要,但它有助于在视图中正确生成路由。您可以尝试将
逐字标记部分作为不应分析的原始文本。我尝试了您的两个想法,错误与您看到的相同,但我从twig得到了错误。twig必须按原样返回文本,即使它是“错误的”javascript文本。