1

我正在使用 Js 助手帮助我将 index.ctp 中“div”的内容替换为另一个文件 changeto.ctp 的内容。

此应用程序有几个带有相应图像的复选框。当我选择一个复选框时,设置存储在数据库中,并显示相应的图像。同样,当未选中时,它将从数据库中删除,并且图像应该消失。

我为此使用 Js 助手:

我的 changeto.ctp 是我的 index.ctp 的子集,可以毫无问题地访问相同的变量和加载(除了没有响应任何单击/更改事件。复选框的 Id 名称完全相同)。

我的索引文件在所有 Html 的底部包含以下 Js 代码:

$this->Js->get($change_checkbox1 )->event('click',
            $this->Js->request(array(
            'controller'=>'testing',
            'action'=>'changeto'
            ), array(
            'update'=>'#changeDiv',
            'async' => true,
            'method' => 'post',
            'dataExpression'=>true,
            'data'=> $this->Js->serializeForm(array(
                    'isForm' => false,
                    'inline' => true
                    ))
            ))

    );

这正在生成以下 Jquery/javascript

     $(document).ready(function () {$("#ck0_1_8").bind("click", function (event)      {$.ajax({async:true, data:$("#ck0_1_8").closest("form").serialize(), dataType:"html", success:function (data, textStatus) {$("#changeDiv").html(data);}, type:"post",   url:"\/mytest-site\/options\/testing"});
        return false;});


}

我的控制器有一个名为

 changeto()
    {

     $this->layout = 'ajax';
    }

我第一次单击此复选框时,它可以正常工作。但是,任何后续点击都不起作用。甚至没有调用 javascript。

我的问题是:

有任何想法吗 ?如果我以某种方式要求 cakephp 在 bind() 中使用 on() / live() 会有所帮助。如果是的话,如何?

谢谢!!

4

2 回答 2

3

通过编辑 cakephp 核心文件解决了这个问题:

lib/Cake/View/Helper/JqueryEngineHelper.php

第 184 行:更改

return sprintf('%s.bind("%s", %s);', $this->selection, $type, $callback);

return sprintf('%s.live("%s", %s);', $this->selection, $type, $callback);

蛋糕版 2.2.2

于 2012-09-13T14:49:05.797 回答
0

你必须使用on而不是bind他们在这个问题中建议的.live() vs .bind()

Helper这就是我所做的就是在View/Helper添加以下方法时创建自己的:

public function onEvent($selector, $type, $callback, $options = array()) {
    $defaults = array('wrap' => true, 'stop' => true);
    $options = array_merge($defaults, $options);
    $function = 'function (event) {%s}';

    if ($options['wrap'] && $options['stop']) {
        $callback .= "\nreturn false;";
    }

    if ($options['wrap']) {
        $callback = sprintf($function, $callback);
    }
    return sprintf('$(document).on("%s", "%s", %s);', $type, $selector, $callback);
}

并从我的观点使用该方法:

echo $this->MyJs->onEvent('#creditcards', 'change', $eventCode, array('stop' => false));
于 2014-03-05T14:54:24.603 回答