0

Zend フレームワークの ajax 応答で dojo 要素を再解析する際に大きな問題が発生しています。シンプルな validationTextBox と送信ボタンがあります。インデックス ページが最初にレンダリングされると、すべての dojo/dijit tundra スタイル/属性などが正しく解析されます。ただし、dojo フォームを再構築して Index View にポストする ajax 呼び出しがある場合。フォームは問題なく投稿されますが、ツンドラ スタイルは機能しなくなります。私は非常に多くの異なることを試しましたが、何時間もかけてどこにも行きませんでした. 支援を試みてくださる方には、事前に感謝いたします。説明するために、この投稿に最も簡単な例を追加しました。

レイアウト.phtml

<?php
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo $this->doctype();
?>
<html>
    <head>
    <meta content="text/html; charset=UTF-8" />
    <script>
    function showForm()
    {
    dojo.xhrGet( {
            url: "../public/index.php?ajax=true",
        // The load function is called on successful response from server
        // It inserts the response to the HTML div “put_here” placeholder
        handleAs:"text",
        sync:true,
            load: function(response, ioArgs)
                    { dojo.byId("welcome").innerHTML = response;
                    return response; 
                },
                // The error function displays error message if server does not
        // respond right
            error: function(response, ioArgs)
            {
            console.error("HTTP status code: ", ioArgs.xhr.status);
            return response;
            }
            });

    //     dojo.parser.parse(dojo.byId("welcome"));
    }
    </script>
    <?php
    echo $this->headTitle();
    echo $this->headStyle();
    echo $this->headScript();
    echo $this->dojo()->setDjConfigOption('parseOnLoad', true);
    echo $this->dojo()->addStyleSheetModule('dijit.themes.tundra');
    echo $this->dojo();                
    ?>
</head>
<body class='tundra'>     
    <div id='ajaxcontent'>
    <?php  echo $this->layout()->content; ?>
    </div>
</body>

indexController.php

<?php

//require_once '../public/js/custom.js';
class IndexController extends Zend_Controller_Action
{
public function init()
{
    $ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('index', 'html')
                ->initContext();
}

public function indexAction()
{                       

    $form = new Zend_Dojo_Form('dojoForm', array('dojotype'=> 'dijit.layout.ContentPane'));    
    $element = new Zend_Dojo_Form_Element_ValidationTextBox('TestBoxName', 
                                                                array(
                                                                    'id' => 'TextBoxId',
                                                                    'required' => true
                                                                )
                                                                );
    $button = new Zend_Dojo_Form_Element_Button('TestButton',
                                                    array(
                                                        'value'=> 'Button',
                                                        'onclick' => 'showForm()'
                                                    ));                                              
    $form->addElements(array($element,$button));       
        $this->view->form = $form;
}
}

index.phtml を表示

<div id="welcome" >
<?php
echo $this->form;
?>

4

1 に答える 1

0

http://validator.w3.org/からページを実行してみてください- おそらく DOCTYPE であり、閉じられていないタグに問題がありますか?

の行は、ボディの下のすべてのノードがテーマ (CSS セレクター) を「継承」する、アサートにaddStyleSheetModule設定されたクラスである css ファイルを追加するだけです。<body>ただし、セレクターは、適切に構築された DOM に大きく依存しています (したがって、検証)。

しかし、ここでの主な問題は、dijit クラスが設定されていないことのようです。おそらく、data-dojo-type が初期化されていないためです。2つのアプローチがあります

1.1 layout.phtml 内

function showForm() { dijit.byId('welcome').set('href', '../public/index.php?ajax=true'); }

1.2 index.phtml 内

contentpane (デフォルトは parseOnLoad) を<div id='welcome'..

<div id="welcome" data-dojo-type="dijit.layout.ContentPane">

2.0 パーサーを手動で呼び出す

load: function(response, ioArgs)
   { var domnode = dojo.byId("welcome");
     domnode.innerHTML = response;
     dojo.parser.parse(domnode);
     return response; 
   }
于 2012-07-15T23:42:25.840 に答える