Cakephp Js助手

时间:2012-06-27 12:31:23

标签: php cakephp

我正在使用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使用on()/ live()insead of bind(),它会有帮助。如果是的话?

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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));