Próbuję użyć przełącznika ng z ng-include poniżej. Problem polega na tym, że ng-init i cały blok kontrolera są ponownie renderowane na każdej zmianie zawierającej ng.ng-include powoduje, że blok kontrolera ponownie wyświetla się
W login_form.html, kiedy użytkownik się loguje, ustawiamy isLoggedIn = true w LoginCtrl. Powoduje to jednak ponowne renderowanie pełnego html poniżej, co powoduje ponowne uruchomienie ng-init.
Jak uniknąć tego cyklu?
<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>
Poniżej znajduje się kod HTML do formularza logowania -
<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>
Poniżej kontroler -
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();
};
});
Cios jest usługa -
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;
}
};
});
Przypuszczam, że moja odpowiedź jest rozwiązanie 1? – asgoth
@gasgoth, cóż, twoje skrzypce używają zasadniczo rozwiązania 1, chociaż istnieje jeszcze inny zakres podrzędny ze względu na dodatkowe kontrolery. Odpowiedź "jeden kontroler" polega zasadniczo na rozwiązaniu 3 - wywołujesz funkcję w zakresie nadrzędnym (która jest dostępna dla zakresów podrzędnych z powodu prototypowego dziedziczenia), aby zmienić właściwość zakresu nadrzędnego. Ale jest tam też trochę rozwiązania 1, ze względu na właściwość obiektu nadrzędnego - możesz użyć prymitywu z rozwiązaniem 3. Oto [skrzypce dla rozwiązania 3] (http://jsfiddle.net/mrajcok/jNxyE /), który używa prymitywu w zakresie nadrzędnym. –
+1 za szczegółową odpowiedź Oznacz. Pozwól mi zaimplementować Twoje rozwiązanie i sprawdź, czy rozwiązuje problem. – murtaza52