1

index.ctp の「div」の内容を別のファイル changeto.ctp の内容に置き換えるために、Js ヘルパーを使用しています。

このアプリケーションには、対応する画像を含むいくつかのチェック ボックスがあります。チェックボックスを選択すると、設定がデータベースに保存され、対応する画像が表示されます。同様に、チェックを外すと、データベースから削除され、画像が消えます。

私はこれに 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は呼び出されていません。

私の質問は次のとおりです。

何か案は ?bind() の代わりに on() / live() を使用するように Cakephp に依頼すると役立ちますか?

ありがとう!!

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

この質問.live() vs .bind()onで示唆されているように、代わりに使用する必要があります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 に答える