2012-02-02 27 views
5

我知道這個問題已經被問及無數次了,在這裏和Yii網站,但我沒有得到解決方案,即使經過每個解決方案。我確信我正在做一些根本性錯誤的事情。所以,如果你仍然讀這個 - 這裏什麼也沒有,Yii - jQuery不在render後部分

我有一個頁面,有一個CheckBoxList小部件被加載。它有一個change()jQuery函數調用,刷新一個完美的CGridView。我也有一個跨度與checkBoxList中的每個項目都有一個點擊事件。

這個點擊事件,進而調用一個控制器,「部分呈現」視圖 -

Yii::app()->clientscript->scriptMap['jquery.js'] = false; 


$this->widget('ext.xxx.EModelWidget', array(
'name' => $widget_name, 
'manufacturer_id' => $manufacturer_id, 
    ) 
); 

以及相應的部件代碼從數據庫中提取數據$後打印的CheckBoxList。

echo CHtml::checkBoxList($this->name, array(), $data, array(
     'class' => 'modelFilter', 
     'separator' => '', 
     'template' => '<div>{input} {label}</div>', 
     'id' => 'dummyID', 
    )); 

正如你所看到的,我已經把類名,將呈現爲一個複選框每個元素是modelFilter

現在我在主視圖文件的腳本只是顯示單擊類modelFilter的複選框時顯示一個警告框。

Yii::app()->clientScript->registerScript('model-selected', " 
$('input.modelFilter').change(function(){ 
    alert('Hellpo!'); 
    }); 
"); 

但不幸的是,這從來沒有發生過。

我在所有的論壇已讀出的兩種常見的解決方案是

一個)的Yii ::應用程序() - > clientscript->腳本映射[ '的jquery.js'] = FALSE;你可以看到我已經適時跟蹤。

b)renderPartial的$ result和$ processOutput參數分別爲false和true。,這也是我所遵循的。

所以我的問題是我該怎麼做才能獲得通過Ajax工作,在Yii加載的內容的更改功能!

+0

據我瞭解...點擊事件也觸發AJAX請求?如果是這種情況,你可以檢查響應中是否包含jQuery JavaScript include?如果是這樣,這可能會重新初始化你的jQuery並搞亂你的JavaScript邏輯,儘管你應該可以通過設置processOutput爲'false'來禁用它。 – schmunk 2012-02-02 16:31:45

回答

7

如果我理解正確,在加載複選框列表之前您正在調用$('input.modelFilter').change()。像這樣使用,事件處理程序不會綁定到調用後插入的任何元素。

您必須使用委託事件而不是直接綁定事件。看一看:http://api.jquery.com/on/(搜索「直接和委託事件」)

$("body_or_input_container").on("change", "input.modelFilter", function(e){ 
    //callback 
}); 
+0

看起來很有希望,讓我檢查一下並回復你!謝謝你的回覆!! – 2012-02-02 17:22:28

+0

男人,你是一個救世主! – 2012-02-03 05:56:20

0

好的,在我找到的解決方案中,無意中,是在部分呈現的文件本身中包含部分呈現文件的jQuery腳本。

雖然,我想知道這種風格是否正確。

+0

但我不認爲這是一個非常好的解決方案。我甚至無法更新主視圖頁面上的gridView! :( – 2012-02-02 13:21:20

4

我有一個類似的問題,我進行了一個Ajax調用,它返回一個局部呈現的HTML與JavaScript內(被Yii的CActiveForm自動生成後)一切都被打破了,因爲沒有jQuery插件已經被識別了。

經過長時間的研究,我發現partial會再次發送jQuery lib,它會通過「忘記」之前已經初始化的所有東西(特別是其他插件,在我的情況下是UI對話框)重新初始化自己。 唯一的解決方法是告訴Yii不要在部分中包含jQuery.js本身,而是包含其他JS文件。

所以把這個放在部分的開頭。

Yii::app()->clientscript->scriptMap['jquery.js'] = false; 

請注意,您必須配置爲在加載頁面時加載一次jQuery。

+0

非常感謝,我有同樣的問題,很難調試。一個奇怪的框架。 – Magicode 2013-10-10 12:28:22

0

在眼睛的情況下的RenderPartial它破壞的JavaScript的現有對象

我有香菜J的驗證一個形式,它完美的作品時,我們使用render(),但不承認香菜對象。所以我們需要重新初始化對象在我的情況下它是

$(「#form」)。parsley();