0

他に何をすべきかわからないので、この質問を投稿します。Zend で同様の質問を見たことがありますが、受け入れられた回答は単に私にとってはうまくいきません。

環境: Zend Framework 1.12 Jquery: jquery-ui.css 用の 1.10.3、jquery-1.9.1.js、および 1.10.3 jquery-ui.js

jquery api ドキュメントのデフォルト機能の例を使用すると、すべてがスムーズに機能し、驚異的に機能します。問題は、コントローラーのアクション「オートコンプリート」に接続する URL をソースとして配置すると発生します。私のコントローラーはうまく機能し、irはjson形式で応答しますが、問題は次のように応答します。

{"json":[{"label":"John-1","value":"John"},{"label":"Jay","value":"Jay-1"},{"label":"Lusi","value":"Lusi-1"}]}

ご覧のとおり、キー 'json' を持つ 1 の配列内にすべてを配置しますが、これは腹立たしいことです。Jquery はそれを理解していないため、jquery はデータを含む配列を必要/必要/検索するだけです。だから私はそれがうまくいかない理由を理解していますが、それを回避する方法がわかりません(私はphp、zend、およびjavascriptが初めてです)。

コントローラーがビュースクリプトとレイアウトのレンダリングを停止し、ビューに渡された情報を json として送信するには、init() メソッドで switchContext ヘルパーを使用します。

 public function init() {
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext('autocomplete', 'json')
                ->initContext();
    }

オートコンプリートアクションは次のとおりです。

public function autocompleteAction()
    {
        $autocomplete_data=array(
            array('label'=>'John-1', 'value'=>'John'),
            array('label'=>'Jay', 'value'=>'Jay-1'),
            array('label'=>'Lusi', 'value'=>'Lusi-1')
        );
       //echo Zend_Json::encode($autocomplete_data);
       $this->view->json= $autocomplete_data;
    }

ご覧のとおり、送信されたすべてのオートコンプリート情報のデータのキーとして「json」を配置する理由は、ビューに渡された変数の名前です。(変数名フォーム json を "lala" に変更してテストしました。URL 経由でアクセスすると、配列のキーは {"lala":[{"label":"John-1"," のように "lala" になりました。値":"ジョン"}....

json_encode() (これは Zend_Json::encode() が使用するものです) を使用して、それをエコーすることも試みたことがわかります。これが送信されるものです:

[][{"label":"John-1","value":"John"},{"label":"Jay","value":"Jay-1"},{"label":"Lusi","value":"Lusi-1"}]

それを使ってデータにアクセスする方法さえ知りません。

配列 [{"label":"something", "value":"something"}...] をそのまま送信する方法を知っている人はいますか?

または、「source:」からの応答を操作して、コントローラーが応答するものを読み取る方法を知っている人はいますか?

編集

わかりました、私は何かに乗っていると思います。jqueryのAPIドキュメントにはこの例があり、ソースからの応答を操作するという、私が望むことをしていると思います。だから私はそれを次のように模倣しようとしました:

$( "#profesor" ).autocomplete({
        source:function(response ) {
            $.ajax({
                url: url,
                dataType: "json",
                success: function( data ) {
                    console.log(data);
                    response(data['json']);
                }
            });
        },
        minLength:1
    });

console.log(data) に到達すると、「data」はコントローラーが送信する応答です (配列に「json」キーを持つもの)。素晴らしいので、オートコンプリートの応答を data['json'] に設定するだけでよいのですが、その行に到達すると...次の例外が発生します:「Uncaught type Error: object is not a function」 . どういう意味ですか?オートコンプリートの「応答」機能にアクセスできないということですか?

FINISH EDIT よろしくお願いします!

4

1 に答える 1

0

「ソース」に関数を不注意に書いたため、例外がスローされていました。jquery api のドキュメントには、この関数には 2 つのパラメーターが含まれていることが記載されています。1 つ目はオートコンプリート入力要素に入力された値 (私の場合、ID が「profesor」のテキスト型) で、2 つ目は応答関数です。「編集された」部分のコードを見ると、パラメーターが 1 つしかないことに気付くでしょう。それを関数として呼び出そうとすると、例外が (その絶対的な権利で) Uncaught type Error: object is not a機能が飛び出します。したがって、これを行う正しい方法は次のとおりです。

 $( "#profesor" ).autocomplete({
            source: function( request, response ) {
                $.ajax({
                    url: url+'/term/'+request.term,
                    dataType: "json",
                    success: function( data ) {
                        response(data['json']);
                    }
                });
            }
        });

私がしたことは、「/term/typedTerm」をURLに追加して、コントローラーが処理してデータベースでそれで始まるものを検索できるようにすることでした。jquery が受け取る応答は、次のとおりです。

[{"label":"YourLabel","value":"LabelValue"},{"label":"Yourlabel2","value":"YourValue2"}]

繰り返しになりますが、コントローラーが {"viewVariableName":[actualData]} でラップされた json データを送信し、必要なものが [actualData] だったため、このアップダウンを経験する必要がありました。contextSwitch _helper を使用せず、代わりに json データを送信することになっているすべてのアクションで手動でレイアウトとレンダリングを無効にしている人には、これは起こらないことに気付きました。

 $this->_helper->viewRenderer->setNoRender(true);
 $this->_helper->layout->disableLayout();
 ....logical stuff here...
 echo Zend_Json::encode($DataToSend);

なぜ私は私のものと一緒にいたのですか?2行のコードを覚える(そして残す)よりも、contextSwitchを使用してjsonデータを送信するコントローラーを1か所で指定するだけです(そのコントローラーのいくつかのアクションがjsonデータを送信するため)。各アクションについて。「いいね」の問題だと思います。

于 2013-06-03T13:21:33.273 に答える