Ich versuche, ng-switch mit ng-include unten zu verwenden. Das Problem ist mit ng-init und der gesamte Controller-Block wird bei jeder ng-includes-Änderung neu gerendert.ng-include bewirkt, dass der Controller-Block wieder rendert
In der login_form.html, wenn ein Benutzer anmeldet, setze ich die IsLoggedIn = true, in der LoginCtrl. Dies führt jedoch dazu, dass der vollständige HTML-Code neu gerendert wird, wodurch der ng-init erneut ausgelöst wird.
Wie vermeide ich diesen Zyklus?
<div ng-controller="LoginCtrl" ng-init="isLoggedIn = false" class="span4 pull-right">
<div ng-switch on="isLoggedIn">
<div ng-switch-when="false" ng-include src="'login_form.html'"></div>
<div ng-switch-when="true" ng-include src="'profile_links.html'"></div>
</div>
</div>
Unten ist der HTML-Code für das Login-Formular -
<form class="form-inline">
<input type="text" placeholder="Email" ng-model="userEmail" class="input-small"/>
<input type="password" placeholder="Password" ng-model="userPassword" class="input-small"/>
<button type="submit" ng-click="login(userEmail, userPassword)" class="btn">Sign In</button>
</form>
Im Folgenden wird der Controller -
angularApp.controller('LoginCtrl', function($scope, currentUser){
$scope.loginStatus = function(){
return currentUser.isLoggedIn();
};
/* $scope.$on('login', function(event, args) {
$scope.userName = args.name;
});
$scope.$on('logout', function(event, args) {
$scope.isLoggedIn = false;
});*/
$scope.login = function(email, password){
currentUser.login(email, password);
};
$scope.logout = function(){
currentUser.logout();
};
});
Schlag der Service ist -
angularApp.factory('currentUser', function($rootScope) {
// Service logic
// ...
//
var allUsers = {"[email protected]": {name: "Robert Patterson", role: "Admin", email: "[email protected]", password: "rob"},
"[email protected]":{name: "Steve Sheldon", role: "User", email: "[email protected]", password: "steve"}}
var isUserLoggedIn = false;
// Public API here
return {
login: function(email, password){
var user = allUsers[email];
var storedPass = user.password;
if(storedPass === password){
isUserLoggedIn = true;
return true;
}
else
{
return false;
}
},
logout: function(){
$rootScope.$broadcast('logout');
isUserLoggedIn = false;
},
isLoggedIn: function(){
return isUserLoggedIn;
}
};
});
Ich nehme an, meine Antwort ist Lösung 1? – asgoth
@asgoth, nun, deine Geige benutzt im Wesentlichen die Lösung 1, obwohl es aufgrund der zusätzlichen Controller noch einen weiteren Kindbereich gibt. Ihre Antwort "Ein-Controller" verwendet im Wesentlichen Lösung 3 - Sie rufen eine Funktion im übergeordneten Bereich auf (die für untergeordnete Bereiche aufgrund einer prototypischen Vererbung verfügbar ist), um eine übergeordnete Bereichseigenschaft zu ändern. Aber dann gibt es auch ein bisschen Lösung 1, aufgrund der Eigenschaft des übergeordneten Objekts - Sie können ein primitiv mit Lösung 3 verwenden. Hier ist eine [Lösung für Lösung 3] (http://jsfiddle.net/mrajcok/jNxyE /) die ein Primitiv im übergeordneten Bereich verwendet. –
+1 für die detaillierte Antwort Mark. Lassen Sie mich Ihre Lösung implementieren und sehen, ob sie das Problem löst. – murtaza52