在Ajax响应中发送数据


Send data in Ajax response

嘿,我正试图使用ajax在另一个下拉列表的基础上填充一个选择下拉列表。我有一个选择填充了投资组合,第二个是空的。当我从第一个选择框中选择一个选项时。我调用了一个ajax函数,在该函数中我发送选定的投资组合id。在ajax方法中,我为选定的id查找组,如何用我找到的组填充第二个选择。我的代码是

包含两个的表单选择

<form name="portfolios" action="{{ path('v2_pm_portfolio_switch') }}" method="post" >
        <select id="portfolios" name="portfolio" style="width: 200px; height:25px;">
            <option selected="selected" value="default">Select Portfolio</option>
            {% for portfolio in portfolios %}
                <option get-groups="{{ path('v2_pm_patents_getgroups') }}" value={{ portfolio.id }}>{{ portfolio.portfolioName }}</option>
            {% endfor %}
        </select><br/><br/>
        <select id="portfolio-groups" name="portfolio-groups" style="width: 200px; height:25px;">
            <option selected="selected" value="default">Select Portfolio Group</option>
        </select><br/>
</form>

JS

 <script>
    $(document).ready(function(){
        $('#portfolios').change(function() {
            var id = $("#portfolios").val();
            var url = $('option:selected', this).attr("get-groups");
            var data = {PID:id};
            $.ajax({
                type: "POST",
                data: data,
                url:url,
                cache: false,
                success: function(data) {
                    //want to populate the 2nd select box here
                }
            });
        });
    }); 
</script>

控制器方法,我在其中找到所选投资组合的组

public function getgroupsAction(Request $request){
    if ($request->isXmlHttpRequest()) {
        $id = $request->get("PID");
        $em = $this->getDoctrine()->getEntityManager();
        $portfolio_groups = $em->getRepository('MunichInnovationGroupPatentBundle:PmPatentgroups')
        ->getpatentgroups($id);
        return $portfolio_groups;
    }
}

知道我如何发送投资组合组并填充第二个选择吗

提前感谢

使用getJson而不是ajax()

Json(JavaScriptObjectNotation)是在php和JavaScript之间发送结构化数据的最简单方法。

这里假设控制器直接响应ajax查询,并且$portfolio_groups是一个以"id"answers"name"为键的关联数组,或者是一个具有相同属性的对象。

在您的PHP控制器中发送json数据:

public function getgroupsAction(Request $request){
    if ($request->isXmlHttpRequest()) {
        $id = $request->get("PID");
        $em = $this->getDoctrine()->getEntityManager();
        $portfolio_groups = $em->getRepository('MunichInnovationGroupPatentBundle:PmPatentgroups')
        ->getpatentgroups($id);
        echo json_encode($portfolio_groups);
    }
}

然后使用getJson检索数据并对其进行迭代:

$.getJSON(url, data, function(result) {
    var options = $("#portfolio-groups");
    $.each(result, function(item) {
        options.append($("<option />").val(item.id).text(item.name));
    });
});

查看getjson文档以了解有关它的更多详细信息

看看这个XML教程(有人会因为我链接到w3schools而大发雷霆),这是一个很好的开始。

从广义上讲,AJAX请求是使浏览器打开一个只有它才能看到(而不是用户)的窗口的调用。向服务器发出请求,服务器返回一个页面,发出请求的脚本可以查看该页面。这意味着任何可以用文本表达的东西都可以通过AJAX传输,包括XML(AJAX中的X代表XML)。

这有什么帮助?考虑一下,如果您试图填充下拉列表,则需要返回一个项目列表来填充它。您可以对页面http://www.mysite.com/mypage.php?d=select1进行ajax调用(如果您不熟悉GET和POST请求,或者对ajax更实用的方面有点一无所知,这里提供了另一个完整的教程),并让它返回如下项目列表:

item1
item2
item3
...

并扫描文本中的换行符。虽然这肯定适用于大多数情况,但它并不理想,而且在所有其他可能使用AJAX的情况下肯定不会有用。相反,可以考虑将PHP(.NET、ASP等)中的返回格式设置为XML:

<drop>
    <item>item1</item>
    <item>item2</item>
    <item>item3</item>
</drop>

并使用解析器中内置的Javascript(此处概述)来获取数据。

我要做的是使用$.load()函数。为此,getgroupsAction应该返回选项html。

JS:

<script>
    $(document).ready(function(){
        $('#portfolios').change(function() {
            var id = $("#portfolios").val();
            var url = $('option:selected', this).attr("get-groups");
            var data = {PID:id};
            // Perhaps you want your select to show "Loading" while loading the data?
            $('#portfolio-groups').html('<option selected="selected" value="default">Loading...</option>');
            $('#portfolio-groups').load(url, data);
        });
    }); 
</script>

我不知道$portfolio_groups是如何存储数据的,但假设您在响应中这样做:

<?php foreach($portfolio_groups as $p) : ?>
    <option value="<?php echo $p->value ?>"><?php echo $p->name ?></option>
<?php endforeach ?>

这样,选择将被getgroupsAction输出的选项填充。

最简单的方法是从控制器返回json字符串,然后在$.ajax.的"成功"调用中处理它

假设$portfolio_groups变量是一个数组:

$portfolio_groups = array('1'=>'Portfolio 1', '2' => 'Portfolio 2');

然后您可以从控制器返回json字符串,如下所示:

echo json_encode($portfolio_groups);

然后,在您的jQueryajax调用中,您可以在响应中捕获此字符串($.ajax的"success"设置)

大致来说,您的$.ajax调用将如下所示:

$.ajax({
    type: "POST",
    data: data,
    url:url,
    cache: false,
    dataType: 'json', // don't forget to add this setting
    success: function(data) {
        $.each(data, function(id, title){
            var node = $('<option>').attr('value', id).html(title);
            // this will simply add options to the existing list of options
            // you might need to clear this list before adding new options
            $('#portfolio-groups').append(node);
        });
    }
});

当然,如果数据不是空的,您还需要添加检查,等等。

假设函数getgroupsAction停留在一个平面php控制器中(不在类内),您应该告诉服务器执行函数

因此,在ajax调用文件的末尾,您几乎不应该首先调用函数(可能是您调用的!)

对于您的专利组结果集,您可以通过php或javascript 生成选择

在第一种情况下,您应该这样做:

//php
  $options = getgroupsAction($_REQUEST);
  $return = "<select name ='"name'" id='"id'"><option value='"'"></option>";
 foreach( $options as $option){
       $return.= "<option value='"$option'">$option</option>";
 }
 $return .= "</select>";
  echo $return;

然后在Javascript中://javascript

  var data = {PID:id};
        $.ajax({
            type: "POST",
            data: data,
            url:url,
            cache: false,
            success: function(data) {
                //inside data you have the select html code so just:
               $('#divWhereToappend').append(data);
            },
    error: function(data) {
                //ALWAYS print the error string when it returns error for a more easily debug
         alert(data.responseText);
            }
        });