我想用jquery autocomplete进行ajax调用,如下所示:
$("#register_player_team").autocomplete({
source: function( request, response ) {
$.ajax({
url: "{{path('volley_scout_getteams_data')}}",
dataType: "jsonp",
success: function( data ) {
console.log(data);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr.status);
console.log(thrownError);
}
});
}
});
在我的routing.yml中,我定义了以下路由:
volley_scout_getteams_data:
pattern: /team/getteams
defaults: { _controller: VolleyScoutBundle:Team:getteams }
在我的TeamController中,我有一个名为getteamsAction()的动作:
public function getteamsAction()
{
$entityManager = $this->getDoctrine()->getManager();
// Get teams from database
$teams = $entityManager->getRepository('VolleyScoutBundle:Teams')->findAll();
foreach($teams as $team){
var_dump($team);
}
die();
}
(dump和die()仅用于测试,我想检查他是否可以找到链接)。 但是当我想进行ajax调用时,我总是会收到以下错误:
http://localhost:8080/volleyscout/web/app_dev.php/user/%7B%7Bpath('volley_s…)%7D%7D?callback=jQuery110207641139030456543_1389372448462&_=1389372448463 404 (Not Found)
由于某种原因,他无法找到行动......有人知道我做错了什么吗?当我尝试这样的链接:web/app_dev.php/team/getteams
我得到了团队的转储..
更新 我的javascript链接在基本视图(twig)中定义,如下所示:
{% block javascripts %}
{% javascripts
'@VolleyScoutBundle/Resources/public/js/jquery-1.10.2.min.js'
'@VolleyScoutBundle/Resources/public/js/*'
%}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}
{% endblock %}
ajax调用在我的page.js中:
(function () {
$("#register_userType").change(function(){
var value = $(this).find("option:selected").val();
if(value == 'P' || value == 'T'){
$('.teams').show();
}
else{
$('.teams').hide();
}
});
$("#register_player_team").autocomplete({
source: function( request, response ) {
$.ajax({
url: "{{path('volley_scout_getteams_data')}}",
dataType: "jsonp",
success: function( data ) {
console.log(data);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr.status);
console.log(thrownError);
}
});
}
});
})();
更新2: 我做了以下事情:
将2条javascript行添加到我的base.html.twig中,如下所示:
{% block javascripts %}
{% javascripts
'@VolleyScoutBundle/Resources/public/js/jquery-1.10.2.min.js'
'@FOSJsRoutingBundle/Resources/public/js/router.js'
'@VolleyScoutBundle/Resources/public/js/bootstrap.min.js'
'@VolleyScoutBundle/Resources/public/js/jquery-ui-1.10.3.custom.min.js'
%}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}
<script src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script>
<script src="{{ asset('bundles/volleyscout/js/security.js') }}"></script>
{% endblock %}
但现在我得到了这个错误:
GET http://localhost:8080/volleyscout/web/app_dev.php/js/routing?callback=fos.Router.setData 500 (Internal Server Error) register:117
Uncaught Error: The route "volley_scout_getteams_data" does not exist.
这很奇怪。当我清除缓存时,它第一次完美运行。当我刷新它显示错误...
答案 0 :(得分:21)
您的javascript代码中的以下行
url: "{{path('volley_scout_getteams_data')}}",
不起作用......
最好的方法是使用 FOSJsRoutingBundle
1 安装 FOSJsRoutingBundle 以在JavaScript代码中公开您的路由。 (非常直接)
2 启用路线
volley_scout_getteams_data:
pattern: /team/getteams
defaults: { _controller: VolleyScoutBundle:Team:getteams }
options:
expose: true
3 调整你的js
var getTeamsUrl = Routing.generate('volley_scout_getteams_data');
$("#register_player_team").autocomplete({
source: function( request, response ) {
$.ajax({
url: getTeamsUrl,
//...
});
}
});
答案 1 :(得分:0)
遇到这个问题/答案,几乎开始在答案中安装@Mick提到的 FOSJsRoutingBundle 。由于我在Ajax请求中遇到完全相同的问题,因此无法获取URL。但是现在我没有看到需要获得FOSJsRoutingBundle ..
什么是没有<form>
标记的输入字段?甚至更好:为什么我的<input>
字段不在<form>
?在表单标记之外包含<input>
字段绝对有效,但实际上没有任何意义。
无论如何,让<form>
围绕<input>
是有道理的,所以如果javascript不起作用,为什么如此,它会将请求发送到正确的位置并加载页面。所以现在如果你有一个表单arround输入只是从那里抓取URL ...
这对我有用:
添加<form>
{{ form_start(form, {'action': path('volley_scout_getteams_data')}) }}
使用javascript获取网址/路径
$.ajax({
url: $(this).closest('form').attr('action'),
答案 2 :(得分:0)
从您的ajax网址中删除{{}}。
答案 3 :(得分:0)
如果您不想安装任何捆绑软件。您可以使用DOM Location主机名属性-window.location.origin
。
首先创建一个简单的全局函数
function getRootUrl() {
return window.location.origin;
}
现在您可以在任何地方使用它,例如:
var getTeamsUrl = getRootUrl() + "/volley/scout/get-teams";
$("#register_player_team").autocomplete({
source: function( request, response ) {
$.ajax({
url: getTeamsUrl,
//...
});
}
});
注意: 它对我有用,但是在某些情况下,此解决方案可能会引起一些问题。