「Hello {{username}}」を示すテスト「hello」ビューがあります。または "Hello anonymous!" このビューには独自のコントローラがあり、url(ui.routerで設定)経由でアクセスできます。AngularJSコントローラのデータを更新する適切な方法
次に、メソッドsetUsername(newUsername)
とgetUsername()
を持つUserModelがあります。
成功してログインするためにsetUsername()
メソッドを使用してコントローラを「hello」ビューに移動すると、ロギングビューも表示されます。
コードは次のようになります。
HelloController:
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();
})
もトップバーにある "ログアウト" ボタンがあります。
.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();
};
とUserModel.onChangesFunctions
にリスナーを追加するためにHelloController
にコードを追加しました:だから、「こんにちは」ビューの変化を示すために、私はUserModel
の際にユーザー状態の変更を呼ぶであろう機能のリストを追加しました。
このアプローチの問題点は、HelloController
が何度も(ユーザーがナビゲートするたびに)、リスナーとして新しい機能を登録するたびに初期化されることです。
ユーザーデータを最新の状態に更新する方法はありますか?