2013-10-14 10 views
6

Se utilizzo una funzione con il normale ng-bind, tutto sembra andare bene. Ma se dovessi usare ng-bind-html, ricevo l'errore di digest infinito.

=== View === 
1. <span ng-bind="test()"> 
2. <span ng-bind-html="test()"> 

=== Controller === 
1. $scope.test = function() { 
     return 1; 
    } 

2. myapp.controller('myapp', function($scope, $sce) { 
    $scope.test = function() { 
     return $sce.trustAsHtml('<input></input>'); 
    } 
}); 

Qualche idea di cosa sta succedendo qui? La vista rende l'input, ma genera quell'errore infinito digest error. La documentazione non è molto utile neanche.

+0

ti sembra di aver chiamato il controller la stessa cosa come il vostro modulo principale . Questa probabilmente non è una grande idea. – ksimons

+0

beh, questo è solo un esempio. ignora che i nomi sono gli stessi. –

+0

Hai un errore che potresti voler correggere anche - anziché KayakDave

risposta

15

Il problema è che quando viene valutato il valore ng-bind-html, Angular chiama la funzione di test e ottiene il risultato di $sce.trustAsHtml('<input></input>'). Angolare quindi valuta nuovamente tutti i collegamenti per vedere se tutto è stato risolto. Ciò significa che richiama ancora una volta la funzione di test e vede se il valore restituito corrisponde al vecchio valore. Sfortunatamente no. Questo perché i valori restituiti da $ sce.trustAsHtml non sono confrontabili con ===.

Prova questa come una prova:

console.log($sce.trustAsHtml('<input></input>') === $sce.trustAsHtml('<input></input>')); 

che stamperà falso. Ciò significa che ogni volta che Angular chiama la funzione di test, restituisce un valore diverso per quanto lo riguarda. Prova un certo numero di volte e poi si arrende.

Se invece si associa il risultato di $ sce.trustAsHtml in una variabile ambito piuttosto che una chiamata di funzione, il problema scompare:

$scope.input = $sce.trustAsHtml('<input></input>'); 

<span ng-bind-html="input"></span> 
Problemi correlati