ho una molto semplice configurazione app angolare, codice come segue:funzione di controller sempre chiamato due volte utilizzando ng presentazione
index.html
<!DOCTYPE html>
<html>
<head>
<script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js'></script>
<script src='app.js'></script>
</head>
<body ng-app="app">
<div ng-controller="MyCtrl">
<div ng-show="ready()">
Some content
</div>
</div>
</body>
</html>
E app.js
var app = angular.module('app', []);
app.controller('MyCtrl', function($scope) {
console.log("MyCtrl called")
$scope.ready = function() {
console.log("ready called");
return true;
}
})
Se si esegue questa operazione con la console aperta, vedrai MyCtrl chiamato una volta e pronto chiamato due volte. Ho passato ore a cercare di capirlo, non vedo alcun motivo per cui lo $scope.ready
verrebbe chiamato ma una sola volta.
Se si utilizza un v1.1.5 angolare e utilizzare ng-if
invece di ng-show
si avrà lo stesso comportamento, ma se si utilizza ng-init
si chiama correttamente $scope.ready
una sola volta. Nel mio caso ho bisogno di ng-show
o ng-if
.
Plunkr: http://plnkr.co/edit/ZSwVNLeFSuhbouXZu9SM?p=preview
Chiarimento: di elaborare su quello che sto puntando, diciamo $scope.ready
ad un certo punto torna a fine false
(forse fa una chiamata AJAX, che non dovrebbe essere chiamato più di una volta), vorrei che "Alcuni contenuti" non siano più visibili. Cioè, comportamento dinamico basato sul risultato di $scope.ready
.
Qualche idea? Grazie per l'aiuto!
Per il record this e this non sono lo stesso problema.
'ng-init' viene chiamato nella fase' $ compile', chiamata solo una volta. Tutto il resto è chiamato nel ciclo '$ digest', che viene sempre chiamato due volte (anche se non ho mai capito perché). –
Cosa mi consigliate allora? Per espandere la mia domanda, quando ad un certo punto '$ scope.ready' restituisce' false' (diciamo che la funzione chiama un'altra funzione), vorrei che "alcuni contenuti" non siano più visibili. Per esempio. comportamento dinamico Grazie – MusikAnimal
Angular sta usando "dirty checking" per vedere se il risultato della tua funzione $ scope è cambiato. Questa è una buona lettura: http://hueypetersen.com/posts/2013/06/17/angular_is_slow/. –