AJAX požadavek nevrací JSON se snippety

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

Ahoj :-) měl bych prosbu, zda mi někdo neporadí. Už se do toho celkem motám.

Mám dvě třídy (dědí od \Nette\Application\UI\Control):

  • TableList → generátor tabulek, má svou vlastní šablonu,
  • DbTableList → obal pro generování tabulek z dat získaných z databáze

TableList má svou vlastní šablonu, kde se tabulka sestavuje. DbTableList si v konstruktoru připojí komponentu pomocí $this->addComponent(...):

/**
   * Konstruktor
   *
   * @return void
   */
  public function __construct(\Nette\Database\Connection $connection, \Nette\ComponentModel\IContainer $parent = NULL, $name = NULL)
  {
    parent::__construct($parent, $name);

    // vnoříme do této komponenty generátor seznamů
    $this->generator = new TableList($parent, $name);
    $this->addComponent($this->generator, 'tablelist');

    // uložíme si objekt spojení s DB
    $this->db = $connection;
  }

V šabloně pro DbTableList mám toto:

{snippet}
{control tablelist}
{/snippet}

Nechtějí se mi ale vykreslovat změny provedené přes AJAX. Ajaxový požadavek vrací HTML celé stránky místo JSON dat se snippety. Máte někdo nějaký nápad, proč je tomu tak?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

První otázka zní – kde voláš invalidateControl()? Pokud nikde, tak ani Nette nebude posílat snippety.

Druhak není moc pěkné to s addComponent. Udělej pro to new TableList v dané komponentě standardní továrničku. A nepřistupuj přes $this->generator, ale přes $this['tablelist'].

dibalaj
Člen | 40
+
0
-

Díky za odpověď.

invalidateControl() volám v handle<Signal> metodě té komponenty DbTableList. Když si „odbinduju“ ajax na tom tlačítku, tak to proběhne v pořádku.

Ještě se zeptám, tento JS na AJAX v Nette stačí, nebo ne?

jQuery.ajaxSetup({
    cache: false,
    dataType: 'json',
    success: function (payload) {
        console.log(payload);
        if (payload.snippets) {
            for (var i in payload.snippets) {
                $('#' + i).html(payload.snippets[i]);
            }
        }
    }
});

$('.ajax').live('click', function (event) {
    event.preventDefault();
    var a = $.get(this.href);
    console.log(a);
});

Pokud si všimneš nahoře v success funkci, jak tam loguju console.log(payload), tak k tomu nikdy nedojde. Pokud namapuju funkci na error událost, tak tam se AJAX dostane.

S těmi komponentami to zkusím

dibalaj
Člen | 40
+
0
-

Problém vyřešen :-) problém byl mezi židlí a klávesnicí :-)
Měl jsem namapovaný AJAX na <img> element s atributem href, který JavaScript nerozpoznal. Předělal jsem to na <a> element, a funguje to v pořádku.

Díky za snahu :-)