Data z presenteru/modelu do js souboru

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

Zdravím, jaký je nejlepší způsob jak dostat do JS souboru data z DB v Nette. Mužu nějak třeba v presenteru vygenerovat JSON do kterého si hodím data co vrátí dotaz na DB?

Šaman
Člen | 2666
+
+3
-

Záleží na konkrétním použití. Na malé věci lze použít data- atribut a informace se předá v šabloně přímo přes prvek, kterého se to týká.

Pokud si JS sám má načitat data (třeba u našeptávače), pak si zavolej handle metodu presenteru a zpátky si pošli odpověď jako JsonResponse.

Editoval Šaman (31. 5. 2016 12:46)

AdamVyborny
Člen | 36
+
0
-

Šaman napsal(a):

Záleží na konkrétním použití. Na malé věci lze použít data- atribut a informace se předá v šabloně přímo přes prvek, kterého se to týká.

Pokud si JS sám má načitat data (třeba u našeptávače), pak si zavolej handle metodu presenteru a zpátky si pošli odpověď jako JsonResponse.

Mám v DB daterange, typ udalosti a autora udalosti, potrebuju to dostat angular JS kalendáře.

AdamVyborny
Člen | 36
+
0
-

Tak jsem to vyřešil zatím tak, že jsem si vytvořil další presenter a prázdnou šablonu, v presnteru si vytvořím JSON v renderShow() takto:

$this->sendResponse(new Nette\Application\Responses\JsonResponse($jsonData));

a v js souboru ho následně takto čtu:

$.get('http://172.22.0.241/json-cal/show', function (data) {
	vm.events = data;
});

Ale zaprvé mi to přijde jako strašná prasárna, za druhé mi vadí ta absolutní cesta a za třetí jsou ty data dostupná na URL i z browseru. Jsem v tomhle uplnej začátečník, může mě někdo nakopnout jak to dělat lépe? Díky

Editoval AdamVyborny (1. 6. 2016 15:39)

CZechBoY
Člen | 3608
+
0
-
  1. muzes pouzit $this->sendJson($data)
  2. kdyz uz tak url generuj pres nette, v latte {plink show}
  3. z browseru je vse dostupny, jinak by to nefungovalo (nenacetl bys nic pres,ajax)
homolka
Člen | 3
+
0
-

Díky tomu, že má Latte Context-Aware Escaping# můžeš postupovat takto:

Presenter:

namespace App\Presenters;

use Nette;

class HomepagePresenter extends BasePresenter
{

	public function renderDefault()
	{
		$this->template->hello =  'hello';
		$this->template->world = 'world';
	}
}

Šablona:

{block content}

	<div id="out" />

{/block}

{block scripts}
	{include parent}

	<script>
		var out = document.getElementById('out');

		out.appendChild(document.createTextNode({$hello} + " " + {$world} + "!!!"));
	</script>
{/block}

Tedy hodnoty proměnných šablony vyrenderuješ přímo v Latte v kontextu JS.

Šaman
Člen | 2666
+
+1
-

Pokud bez šablony, pak použij handleShow() místo render. A jak psal CZechBoY, pro to odesílání existuje zkratka $this->sendJson($jsonData), která dělá totéž.

AdamVyborny
Člen | 36
+
0
-

Šaman napsal(a):

Pokud bez šablony, pak použij handleShow() místo render. A jak psal CZechBoY, pro to odesílání existuje zkratka $this->sendJson($jsonData), která dělá totéž.

A pokud to dám přes handleShow() bez šablony, pod jakou url to můžu volat?

Darkling
Člen | 35
+
+1
-

Tu url si do js předej přes data atribut. Takže v šabloně bude něco jako

<div data-url="{link show!}" id="idecko"></div>

V js pak

<script>
var url = $('#idecko').data('url'); // pokud používáš jquery
var url = document.getElementById('idecko').getAttribute('data-url'); // pure js
</script>

Výhoda řešení, pokud se změní doména nebo něco, vše bude stále fungovat.

homolka
Člen | 3
+
+1
-

AdamVyborny napsal(a):

Šaman napsal(a):

Pokud bez šablony, pak použij handleShow() místo render. A jak psal CZechBoY, pro to odesílání existuje zkratka $this->sendJson($jsonData), která dělá totéž.

A pokud to dám přes handleShow() bez šablony, pod jakou url to můžu volat?

URL na handle vygeneruješ takto:

Presenter

$this->link('show!')

Latte

{link show!}
CZechBoY
Člen | 3608
+
0
-

@Darkling Proč předávat url do html, když s ní pracuju v js?

<script n:syntax="double">
var promenna = {{$promenna}};
</script>