2013-06-18 14 views
7

Situazione:ng-includono - Controller è chiamato più volte

Sto cercando di includere un parziale ng-include senza la necessità di alcun instradamento. Voglio solo includere uno specifico parziale di molti in modo dinamico. Questo è più o meno come appare:

<div ng-controller="SomeController"> 
    //This controller defines a $scope.getPartial(id) 
    <ng-include src="getPartial(something.id)"></ng-include> 
</div> 

Funziona, il parziale è incluso. Ma guardando la console posso vedere che il controller è chiamato più volte e la prima volta che viene chiamato, ho un percorso GET 404

/a/i parziali/undefined.html [HTTP/1.1 404 Not Found 162 ms]

sembra che something.id non sia definito, quando l'inclusione viene effettuata per la prima volta.

Domande:

  • come posso semplicemente includere un parziale, senza la creazione di un nuovo ambito?
  • se ciò non è possibile, come posso essere sicuro che il controller venga chiamato una sola volta?
  • e come posso evitare il 404?

Sono abbastanza nuovo per AngularJS e quindi posso fare supposizioni errate su cose o perdere cose ovvie, per favore illuminami.

risposta

6
  1. ngInclude crea un nuovo ambito per definizione in modo da non poterlo eludere facilmente. E poiché gli ambiti nidificati si ereditano l'uno dall'altro, il tuo ambito appena creato sarà in grado di leggere qualunque cosa sia nel tuo SomeController, quindi non dovresti avere problemi con il nuovo ambito.
  2. ng L'attributo src di Inclusive verrà rivalutato su ogni ambito $ digest, quindi non è possibile impedirgli di chiamare ripetutamente il metodo del controller. Del resto è necessario assicurarsi che il metodo è leggero e veloce e restituisce lo stesso risultato dato lo stesso input
  3. Si può evitare di iniziale 404 restituendo una stringa vuota "" quando id non è ancora definita:

 

$scope.getPartial = function(id){ 
    if(!id){ 
    return ""; 
    } 
    ... 
} 
+7

+1. Vorrei anche aggiungere che in molti casi angolari si chiameranno più volte o talvolta inaspettati. Devi spostare la tua comprensione da imperativa a dichiarativa. Pensa css. Non ti interessa (normalmente) quante volte il browser ridisegna, riflette in base alle modifiche di stile/classe –

+0

+1 Buon confronto con il ridisegno dei CSS. – Stewie

+0

Grazie, sembra un po 'hacky ma forse non sono abituato al paradigma ridipinto;) – markus

Problemi correlati