Yii - jQuery在renderPartial之后无法正常工作

时间:2012-02-02 12:56:21

标签: jquery yii renderpartial

我知道这个问题在这里和Yii网站上被多次询问过,但即使在完成每个解决方案之后我都没有得到解决方案。我确信我做的事情从根本上是错误的。所以,如果你还在读这个 - 这里什么都没有,

我有一个正在加载CheckBoxList小部件的页面。它有一个change()jQuery函数调用,刷新一个完美运行的CGridView。我还有一个与checkBoxList中具有click事件的每个项相关的span。

此点击事件依次调用“部分呈现”视图的控制器 -

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


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

相应的窗口小部件代码在从db获取$ data后打印CheckBoxList。

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

正如您所看到的,我已将每个要呈现为复选框的元素的类名称设为 modelFilter

现在我在主视图文件中有一个脚本,只需在单击类modelFilter的checkBox时显示一个警告框。

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

但不幸的是,这种情况从未发生过。

我在所有论坛中阅读的两个常见解决方案是

a) Yii :: app() - &gt; clientscript-&gt; scriptMap ['jquery.js'] = false; ,您可以看到我已正式关注。

b) $ result和$ processOutput参数的renderPartial分别为false和true。,这也是我所遵循的。

所以我的问题是我应该怎么做才能在通过Ajax工作的内容上获取更改功能,在Yii !!

4 个答案:

答案 0 :(得分:7)

如果我理解正确,您在加载复选框列表之前调用$('input.modelFilter').change()。像这样使用事件处理程序不会绑定到调用后插入的任何元素。

您必须使用委派事件而不是直接绑定事件。请查看:http://api.jquery.com/on/(搜索“直接和委派活动”)

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

答案 1 :(得分:4)

我遇到了类似的问题,在我执行Ajax调用后返回部分渲染的HTML内部javascript(由Yii的CActiveForm自动生成)所有内容都被破坏,因为没有jQuery插件被识别了。

经过长时间的研究后,我发现部分是再次发送jQuery lib,它通过“遗忘”之前已经初始化的所有东西(特别是其他插件,在我的例子中是UI对话框)重新初始化自己。 唯一的解决方法是告诉Yii不要在部分中包含jQuery.js本身,而是包含其他JS文件。

所以把它放在部分的开头。

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

请注意,您必须配置为在页面加载时加载jQuery一次。

答案 2 :(得分:0)

好的,对于我发现的解决方案,无论是意外,是在部分呈现的文件中包含部分呈现文件的jQuery脚本。

我想知道这种风格是否正确。

答案 3 :(得分:0)

在eye renderPartial的情况下,它会破坏现有的javascript对象

e.g

我有一个带有欧芹j验证的表单,当我们使用render()但它不能识别欧芹对象时,它可以很好地工作。所以我们需要在我的情况下再次重新初始化对象

$( “#形式”)欧芹();