为了改善初始页面加载,我创建的页面上的大部分内容仅在需要时加载。为此,我通过ajax调用使用以下代码。
$this->renderPartial('_callhistory', array(
'modelCalls'=>$modelCalls,
'fid'=>$fid,
), false, true);
这很好,所有小部件都可以正常工作。它引起了主题设计的问题,但这不是目前的主要问题。
我遇到的问题是有时需要再次调用ajax来更新视图。要做到这一点,我用相同的参数调用完全相同的ajax函数,但在第二次调用时,所有小部件(即:TbSelect2和CJuiDatePicker)停止工作,而是我得到标准选择和日期的文本框。这反过来又破坏了客户端验证。
其他Q&提到.unbind()
,这是要走的路吗?如果是这样,我是否正确地说在ajax调用之前所有widget元素都需要取消绑定?
谢谢,我也会发布我的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 :(得分: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