2014-12-09 3 views
0

У меня возникли проблемы с некоторыми AJAX в yii. Короче говоря, у меня есть вызов AJAX, который возвращает кучу HTML, т. Е. Таблицу позиций заказа. Возвращаемые данные представляют собой строки элементов заказа, и каждая из этих строк также имеет функции AJAX. Например, вы добавляете элемент заказа, который возвращает нужный HTML и добавляет элемент заказа к существующим элементам. Возвращенная строка для нового элемента имеет поле скидок, которое также работает с использованием AJAX. Если я добавлю элемент, а затем попытаюсь ввести в поле скидки, то функция скидок AJAX не будет вызываться в добавленной строке, но будет работать для существующих строк. Если я обновляю страницу, и элемент, конечно, присутствует, поле скидок отлично работает. Похоже, что все необходимое HTML передано, но не JQUERY для вызова AJAX.Yii Ajax - поле возврата с Ajax

Вот несколько кодов, специально связанных с этой проблемой, снова это касается элементов заказа, но код специально позволяет создать строку и создает кнопку удаленияв конце строки. Эта кнопка не работает, пока страница не обновится.

мнение имеет следующее:

/* 
    ** This is used to pull in the items. 
    */ 
    echo '<div id="order_items">'; 

    echo OrderItems::model()->createEngineerOrderForm($model->order_id); 

    echo '</div>'; 

Вот пример кода в методе:

$field .= '<div class="small-1 columns">'.Chtml::textField('',$item->qty,array('disabled'=>true)).'</div>'; 
     $field .= '<div class="small-1 columns">'.CHtml::ajaxLink('&nbsp;',Yii::app()->createUrl('Orders/removeOrderItem'),array(
          'type'=>'POST', 
          'dataType'=>'json', 
          'data'=>array('item'=>$item->id), 
          'success'=>'function(data){ 

                 if(data.save == true) 
                 { 
                  $("#order_items").html(data.items) 
                  $("#info-flash").html("<div class=\"alert-box success\">" + data.message + "<a href=\"#flash-div\" class=\"flash_close\" id=\"close_btn\"></a></div>"); 
                  $("#close_btn").click(function(){ $(".alert-box").fadeOut("slow"); }); 
                  return false; 
                 } 
                 else 
                 { 
                  $("#info-flash").html("<div class=\"alert-box alert\">" + data.message + "<a href=\"#flash-div\" class=\"flash_close\" id=\"close_btn\"></a></div>"); 
                  $("#close_btn").click(function(){ $(".alert-box").fadeOut("slow"); }); 
                  return false; 
                 } 


                }'), 
        $htmlOptions=array ('class'=>'delete-button','confirm'=>($item->rl_products->is_installation == 2) ? Yii::t('app','misc.order_delete_install') : Yii::t('app','misc.order_delete'),'id'=>'delete_'.$item->id)).'</div>'; 





     $field .= '</div>'; 
    } 



    return $field; 

Вот пример кода для удаления вызова:

if($item->save()) 
     { 
      $linked = OrderItems::model()->findAll(array('condition'=>'linked = :linked AND status_id = 1 AND order_id = :order_id','params'=>array(':linked'=>$item->id,':order_id'=>$item->order_id))); 
      foreach($linked as $link) 
      { 
       $link->status_id = 3; 
       $link->save(); 
      } 

      echo json_encode(array('save'=>true,'message'=>Yii::t('flash','orderitem_removal_success'),'items'=>OrderItems::model()->createEngineerOrderForm($item->order_id))); 

     } 

Надеюсь, это имеет смысл, но любые вопросы дайте мне знать.

Update

Вот небольшой пример, который вы можете проверить, чтобы увидеть вопрос, который я имею в виду. Эффективно здесь у вас должна быть кнопка, кнопка A, вы нажимаете кнопку A и другую кнопку, появляется кнопка B. Затем вы нажимаете кнопку B, и она должна alert «Успешно». Первый вызов ajax из Button A работает, но второй вызов ajax от Button B не работает.

Вот вида код:

<?php 

echo CHtml::ajaxSubmitButton('Button-A', 
CHtml::normalizeUrl(array('/Accounts/testAjax')), 
array('success'=>'function(data) 
           { 
            $("#button-test").html(data); 
           }', 
'type'=>'POST'),array('id'=>'button-a')); 



?> 
<div id="button-test"></div> 

Вот контроллера кода:

public function actiontestAjax() 
{ 
    echo CHtml::ajaxSubmitButton('Button-B', 
CHtml::normalizeUrl(array('/Accounts/testAjax2')), 
array('success'=>'function(data) 
        { 
         alert(data); 
        }','type'=>'POST'),array('id'=>'button-b')); 

} 

public function actiontestAjax2() 
{ 
    echo successful; 
} 
+0

Не могли бы вы включить код действия вашего контроллера, который используется для обработки вызова AJAX? – topher

+0

@topher Я включил небольшой пример для тестирования, чтобы показать проблему. См. Раздел обновления моего вопроса. –

ответ

0

Наконец нашел ответ на это после поиска всех изменений, которые я мог думать. Проблема, как представляется, объясняется здесь:

https://code.google.com/p/yii/issues/detail?id=38

В частности, этот пункт:

Проблемы также находятся в классах виджетов. Нам нужно лучшее решение.

Причина этой проблемы заключается в том, что функция js в режиме «готов» вызывается перед ajax выполняется «обновление/замена». Поэтому ожидаемые обработчики onclick и других событий не привязаны к соответствующим HTML-элементам, сгенерированным ajax «update/replace».

Возможное решение этой проблемы состоит в том, что мы обертываем эти js внутри функции, и зарегистрируем эту функцию в «ready». Для ajax «update/replace» мы явно вызываем эту функцию . Потенциальная проблема заключается в том, что обработчик onclick может быть зарегистрирован несколько раз.

страница предлагает несколько решений, но в общем, решение заключается в использовании renderPartial так:

$this->renderPartial('wdcalendar.views.default.engineer_files.render_form',array('model'=>$event),false,true); 

Поместите код необходимо на страницу просмотра, а затем эхо renderPartial в контроллере, а затем используя успех ajax, мы можем заменить html новым визуализированным контентом.

В этом случае особенно важно ложное, истинное в конце.