2014-01-07 1 views
0

초기 페이지로드를 향상시키기 위해 필자가 작성하는 페이지의 대부분의 컨텐츠는 필요한 경우에만로드됩니다. 이렇게하려면 아약스 호출을 통해 다음 코드를 사용하고 있습니다.Yii & Bootstrap 위젯이 두 번째 Ajax 이후 작동하지 않습니다.

$this->renderPartial('_callhistory', array(
         'modelCalls'=>$modelCalls, 
         'fid'=>$fid,       
), false, true); 

위젯 모두 작동합니다. 그것은 메인 테마의 디자인에 문제를 일으키고 있지만, 현시점에서 중요한 이슈는 아닙니다.

내가 아는 문제는보기를 업데이트하기 위해 다시 호출해야 할 때가 있습니다. 이렇게하려면 동일한 매개 변수를 사용하여 똑같은 Ajax 함수를 호출하지만 두 번째 호출에서는 모든 위젯 (즉 : TbSelect2 및 CJuiDatePicker)이 작동을 멈추고 대신 표준 선택과 날짜에 대한 텍스트 상자를 얻습니다. 이렇게하면 클라이언트 측 유효성 검사가 중단됩니다.

기타 Q & .unbind()처럼이 방법이 있습니까? 그렇다면 모든 위젯 요소가 아약스 호출 전에 바인딩 해제되어야한다고 말하는 것이 맞습니까?

고마워, 나는 내 Ajax도 게시 할 것이고, 단지 이것과 같은 모든 업데이트를 처리한다는 것을주의하라.

function renderSectionView(fid, viewid, headerid, panelid, extraparams){ 
    var panel = $('#'+panelid); 
    panel.html("<img src='images/ajax-loader-bar.gif' class='loadingbar' />"); 

    var param = { 'fid':fid, 
      'viewid':viewid 
      }; 

    var url = controller_url_builder('SubViewAjax', param); 

    var jqxhr = $.post(url, extraparams, function(data) { 
     panel.html(data); 
    }) 
    .done(function() { 
     renderedlist.push(viewid+fid); 
    }) 
    .fail(function() { 
     panel.html("<span class='error'>There has been an error, please refresh the page and try again</span>"); 
    }) 
    .always(function() { 
     scrollToAcc(headerid); 
    }); 
} 

답변

0

나는 마침내 여기에이 덕분에 해답을 발견 :

Yii Framework Forum: ajax and widgets

비결은 컨트롤러에 위젯을 렌더링하지만, 그래서 같은 변수로 출력을 저장하는 것입니다 :

$html = $this->widget($className, $properties=array (), TRUE); 

참고 : 최종 'true'매개 변수를 사용하면 결과를 $html 변수에 저장할 수 있습니다.

그런 다음 클라이언트 스크립트를 사용하여 스크립트를 렌더링하십시오.

Yii::app()->getClientScript()->renderBodyBegin($html); 
Yii::app()->getClientScript()->renderBodyEnd($html); 

그럼 그냥 (내가 renderPartial 통해하고 있어요) 뷰에 변수를 전달하고 위젯을 필요로하는 곳에 echo $html를 사용

관련 문제