Ich habe eine Test "Hallo" Ansicht zeigt "Hallo {{Benutzername}}!" oder "Hallo anonymer!". Diese Ansicht hat einen eigenen Controller und ist über die URL erreichbar (configure by ui.router). Dann habe ich ein UserModel mit den Methoden setUsername(newUsername)
und getUsername()
.AngularJS ordnungsgemäße Aktualisierung von Daten in Controller
Es gibt auch eine Protokollierungsansicht mit einem Controller, der die Methode setUsername()
für die erfolgreiche Anmeldung verwendet und dann zur Ansicht "hallo" navigiert.
Der Code sieht wie folgt aus:
Hello:
anguler.module('hello', ...
.config(function($stateProvider){
$stateProvider
.state('hello', {
url: '/hello',
views: {
'[email protected]': {
controller: 'HelloController as helloController',
templateUrl: 'app/hello/hello-tmpl.html'
}
},
});
})
.controller('HelloController', function (UserModel) {
var helloController = this;
helloController.username = UserModel.getUsername();
})
Es gibt auch einen "Abmelden" Button in der oberen Leiste. Also, um die Änderungen in „Hallo“ Ansicht zu zeigen, habe ich eine Liste der Funktion, die UserModel
nennen würde, wenn der Benutzer Zustandsänderungen:
.service('UserModel', function() {
var model = this;
var username = '';
var onChangesFunctions = [];
function onChange() {
onChangesFunctions.forEach(function(f) {
f();
});
}
model.onChange = function(f) {
onChangesFunctions.push(f);
};
model.setUsername = function(newUsername) {
username = newUsername;
onChange();
};
model.clearUserData = function() {
username = '';
onChange();
};
und einen Code in HelloController
hat einen Hörer zum UserModel.onChangesFunctions
hinzuzufügen.
Das Problem mit diesem Ansatz ist, dass HelloController
viele Male initialisiert wird (jedes Mal, wenn der Benutzer zu ihm navigiert) und jedes Mal, wenn es eine neue Funktion als Listener registriert.
Gibt es eine bessere Möglichkeit, Benutzerdaten zu aktualisieren?