1

您好,我需要使用 ajax 保存多个值并更新数据库。我正在研究 Yii 框架。

首先,我需要使用 ajax 作为 json 发送数据,但结果有误。

实时代码:http: //jsfiddle.net/kxJwp/2/

我的 JavaScript 代码是:

$("#save").live('click', function(){
    var showtimes = [];
    var values = {};
    $('li inputs').each(function() {
        values[$(this).attr('name')] = $(this).val();
    });
    $('li').each(function(i) {
        showtimes[i]=values;
    });
    alert(JSON.stringify(showtimes));
});

Javascript 输出:

它输出最后一个 li 值 x li 的数量

输入:

<li>
    <input name="show_id" class="show_id att" type="hidden" value="" />
    <input name="movie_id" class="movie_id att" type="hidden" value="" />
    <input name="cinema_id" class="cinema_id att" type="hidden" value="" />
    <input name="status" class="status att" type="hidden" value="" />
    <input name="times" class="timesArray att" type="hidden" value="" />
<li>
<li>
    <input name="show_id" class="show_id att" type="hidden" value="" />
    <input name="movie_id" class="movie_id att" type="hidden" value="" />
    <input name="cinema_id" class="cinema_id att" type="hidden" value="" />
    <input name="status" class="status att" type="hidden" value="" />
    <input name="times" class="timesArray att" type="hidden" value="" />
<li>
4

3 回答 3

3

您只看到一行,因为您只有一个对象,而您需要一个对象数组,因此首先声明一个数组,然后继续向其中添加对象。像这样的东西:

$("#save").live('click', function(){
  var showtimes = [];    // Create empty javascript array
  var objec={};
  $("li").find("input").each(function(index) {           // Iterate over inputs

    objec=new Object; // to create a new object for every matched element

    objec[$(this).attr('name')]=$(this).val()+'avla';
    showtimes[index]=objec;  // Add object to array
  });

  var json = JSON.stringify(showtimes);
  alert(json);
});

代码说明:使用 的内置索引each(),通过将索引传递给函数,例如:function(index){...}.

编辑:objec=new Object;需要避免重复值,因为每次将相同的对象添加到数组中,但是使用 new 时,每次都会创建一个新对象并将其添加到数组中。

更新:选择 s 的更好方法li是使用选择器,例如 :$("li:has(input)")然后循环遍历子项:

$("#save").live('click', function(){
    var showtimes = [];
    var values = {};
    $("li:has(input)").each(function(i){
        values = new Object;
        $(this).children().each(function(){
            values[$(this).attr('name')]=$(this).val();
        });
        showtimes.push(values);
    });
    alert(JSON.stringify(showtimes));
});

编辑:上述两个示例中的输出(形成的数组)是不同的。

代码示例 1 的输出:

json=[{"show_id":"1avla"},{"movie_id":"2avla"},{"cinema_id":"3avla"},{"status":"4avla"},{"times":"5avla"},{"show_id":"6avla"},{"movie_id":"7avla"},{"cinema_id":"8avla"},{"status":"9avla"},{"times":"0avla"}]

代码示例 2 的输出:

json=[{"show_id":"1","movie_id":"2","cinema_id":"3","status":"4","times":"5"},{"show_id":"6","movie_id":"7","cinema_id":"8","status":"9","times":"0"}]
于 2012-06-05T20:28:35.590 回答
0

您的原始 js 代码显示

$("tr").find("input.att").each(function() {

但是您的视图代码显示您正在使用<li>而不是<tr>

所以不应该$("ul") or $("li")

于 2012-06-03T05:40:44.510 回答
0

您可以使用另一种替代方法。您应该进行的更改是将lis 和input's 放在表单下,并通过 ajax 提交表单。此外,您应该根据更改输入的名称,即添加方括号,以便您可以在 PHP 中将其作为数组检索。不需要json所以

    <form id="myform" action="action.php">
    .....
    <li>
        <input name="show_id[]" class="show_id att" type="hidden" value="" />
        <input name="movie_id[]" class="movie_id att" type="hidden" value="" />
        <input name="cinema_id[]" class="cinema_id att" type="hidden" value="" />
        <input name="status[]" class="status att" type="hidden" value="" />
        <input name="times[]" class="timesArray att" type="hidden" value="" />
    <li>
    <li>
        <input name="show_id[]" class="show_id att" type="hidden" value="" />
        <input name="movie_id[]" class="movie_id att" type="hidden" value="" />
        <input name="cinema_id[]" class="cinema_id att" type="hidden" value="" />
        <input name="status[]" class="status att" type="hidden" value="" />
        <input name="times[]" class="timesArray att" type="hidden" value="" />
    <li>

    ....

</form>

和 ajax 的 javascript

$("#save").live('click', function(){
    var form = $('#myform');
    $.ajax( {
      type: "POST",
      url: form.attr( 'action' ),
      data: form.serialize(),
      success: function( response ) {
        console.log( response );
      }
    } );


});

然后在您的控制器中,您将获得提交的数据作为数组

print_r($_POST['show_id']);
print_r($_POST['movie_id']);

等等等等

于 2012-06-07T08:52:47.760 回答