Dynamické snippety při rewrite kontejneru nereagují

Spectator
Člen | 48
+
0
-

Ahoj,

při použití dyn. snippetů chápu že:

  1. Je nutné dynamické snippety obalit nějakým, statickým a ten překreslovat v příkladu usersList
  2. pro nepřenášení zbytečně všech prvků stačí poslat jediný a při použití nette.ajax.js a data-ajax-append=„true“ na kontejneru vyvolat pouze append tohoto prvku.
  3. proměnnou pro template s uživateli je potřeba vytvořit v handle a v render metodě jen kontrolovat obsah a případně doplnit full seznamem – životní cyklus …

Proč tedy nefunguje toto kód níže
Primitivně tam přidám pomocí add! random záznam a překreslím last update snippet a kontejner dyn. snippetů. lastUpdate se obnoví, seznam je mrtvý.
Co je podle mne špatně je response JSON viz dole. Podle mne by měl obsahovat obsah snippetu usersList s jedním prvkem. Nějak v tom nevidím ten problém. Chápu je se to určitě opakuje po sté, ale nevidím to.

	<div id="content">
		<span>
			<a class="ajax" n:href="add!">Add random user</a>
		</span>
		<br>
		<span>
			Last update: <span n:snippet="lastUpdate">{$lastUpdate}</span>
		</span>
		{*<div n:snippet="listContainer">*}
			<ul n:snippet="usersList" data-ajax-append="true">
					<li n:foreach=" $users as $userItem" n:snippet="user-$userItem->user_id">
						<strong>{$userItem->first_name}</strong>: {$userItem->modified_date->format("d.m.Y H:i:s")}
						<a class="ajax" n:href="update! $userItem->user_id">update</a>
						<a class="ajax" n:href="remove! $userItem->user_id">delete</a>
					</li>
			</ul>
		{*</div>*}
	public function renderDefault()
	{
		if (!isset($this->template->users)) {
			$this->template->users = $this->context->table('user');
		}
		$this->template->lastUpdate = (new \DateTime())->format('H:i:s');
	}

	public function handleAdd()
	{
		$this->context->table('user')->insert([...]);
		$id = $this->context->getInsertId();
		$this->template->users = [$this->context->table('user')->get($id)];
		$this->redrawControl('lastUpdate');
		$this->redrawControl('usersList');
		// $this->redrawControl('listContainer');
	}

Response
{"state":[],"snippets":{"snippet--lastUpdate":"08:49:24","snippet--user-183":"\t\t\t\t\t\t<strong>first_name - 472</strong>: 18.06.2017 08:49:24\n\t\t\t\t\t\t<a class=\"ajax\" href=\"/?id=183&amp;do=update\">update</a>\n\t\t\t\t\t\t<a class=\"ajax\" href=\"/?id=183&amp;do=remove\">delete</a>\n"}}

Editoval Spectator (18. 6. 2017 10:31)

David Matějka
Moderator | 6445
+
0
-

Ahoj, ta response je spravna. potiz bude v tom, ze to neni kompatibilni s data-ajax-append.

Dynamicke snipety slouzeji k aktualizaci obsahu stavajicich snippetu, ne pro pridavani novych. v tvem pripade by tedy melo stacit smazat v sablone ten dynamicky snippet ` n:snippet=„user-$userItem->user_id“`

Spectator
Člen | 48
+
0
-

Néé! To je vtip… Mno, tak díky, tohle by mne teda nenapadlo.