在Symfony 3.0上使用twig生成Javascript,而不干扰Javascript代码中的{}
我尝试生成一种方法,通过使用twig的路径函数可以获得每个ajax调用的URL。我之所以这样做,是因为我试图通过使用Knockout MVVM和require.js创建一个单页应用程序,因此我需要Ajax调用,需要动态生成URL 我这样做的方式是创建一条路线:在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
/**
*@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文本。