Vycisteni formulare po odeslani AJAXem

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
blueticket
Člen | 41
+
0
-

Zdravim vas,

narazil jsem na divny problem ohledne AJAXoveho odeslani formulare. Formular se odesle, snippet se prekresli, vsechno je spravne, jenomze po odeslani zustanou vsechny fieldy ve formulari vyplneny a prestane fungovat AJAXove, tedy s postback-em, nasledne jde opet AJAXove (tedy se to strida, jednou AJAX, jednou klasicky post, ale vzdy zustane tentyz field vyplnen ve vsech vykreslenych formularich). Ten formular se na strance vykresli N-krat, tedy ne pouze jednou, jde totiz o komentare k timeline eventum (neco podobne, jak na facebooku)

kod v latte:

{foreach $timeline_rows as $row}
                <form n:name="commentTimeline" class="ajax">
                    <div class="input-group" style="float:left;padding:10px;background-color: #EDEBE4;">
                        <input type="hidden" n:name=snippet_id value="{$row->id}" />
                        <input type="text" n:name=comment class="form-control font_size_13px" style="z-index: 0;" placeholder="{_ 'Write a comment'}...">
                        <span class="input-group-btn">
                            <button class="btn btn-default font_size_13px" type="submit" n:name=btnSubmit><i class="fa fa-comment fa-1x"></i></button>
                        </span>
                    </div>
                </form>
{/foreach}

Kod v presenteru:

protected function createComponentCommentTimeline() {
    $form = new Form();
    $form->addHidden("snippet_id");
    $form->addText("comment")->setRequired();
    $form->addSubmit('btnSubmit')->onClick[] = array($this, 'commentSucceeded');
    return $form;
}

public function commentSucceeded($button) {
    try {
        $values = $button->getForm()->getValues();

        $this->data_model->addTimelineComment($this->logged_in_id, $this->profile_id, $values['snippet_id'], $values['comment']);

        if ($this->presenter->isAjax())
        {
            $this->invalidateControl('areaComments');
            $this->invalidateControl('areaCommentTimeline');
        }
    } catch (\Exception $ex) {
        $this->flashMessage($ex->getMessage());
    }
}

a @layout.latte obsahuje javascript:

<script type="text/javascript">
     /* Volání AJAXu u všech odkazů s třídou ajax */
     $("a.ajax").on("click", function (event) {
         event.preventDefault();

         // zobrazení spinneru a nastavení jeho pozice

         $("#ajax-spinner").show();
         $.get(this.href);
     });

     /* AJAXové odeslání formulářů */
     $("form.ajax").on("submit", function () {
         $(this).ajaxSubmit();
         return false;
     });

     $("form.ajax :submit").on("click", function () {
         $(this).ajaxSubmit();
         return false;
     });

 </script>

Nevidite nahodou nekdo o jaky problem se jedna? Dekuji moc!

Hurass
Člen | 114
+
0
-

Data z formuláře můžeš odstranit v metodě commentSucceeded před překreslením snippetů.
Aby ti fungovalo AJAXové odeslání formuláře několikrát po sobě, použit on submit takto:

<script>
	$("body").on("submit", "form.ajax", function () {
    	$(this).ajaxSubmit();
    	return false;
	});
</script>