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>