0

Angular doc の状態:

Angular services are singletons

angular サービスをシングルトンとして使用したいので、アプリケーションのどこからでもログインしているユーザー データにアクセスできます。しかし、サービスは同じデータを返していないようです。これが私のコードです。

サービス:

angular.module("myapp", [])

.service("identity", function (){
    this.token = null;
    this.user = null;
});

工場:

.factory("authentication", function (identity, config, $http, $cookieStore) {
var authentication = {};

authentication.login =  function (email, password, remember) {
    var p=$http.post(config.baseUrl+"api/","email="+email+"&password="+password);

    return p.then(function (response) {
            identity= response.data;

            if (remember) {
                $cookieStore.put("identity", identity);
            }
        });
};

authentication.isAuthenticated = function () {
    if (!identity.token) {
        //try the cookie
        identity = $cookieStore.get("identity") || {};
    }
    console.log(identity) // {token: 23832943, user: {name: something}}
    return !!identity.token;
};

return authentication;
});

コントローラー:

.controller('LoginCtrl', function ($state, $scope, authentication, identity) {

    var user = $scope.user = {};

    $scope.login = function () {
        authentication.login(user.email, user.password, user.remember)
        .then(function () {
            if (authentication.isAuthenticated()) {
                console.log(identity); // {token:null, user: null}
                $state.transitionTo("dashboard");
            }
        });
    };
});

ID は、認証とコントローラーの両方に注入されます。ただし、最初のコンソールは正しいユーザー データをログに記録しますが、2 番目のコンソールは最初に定義されたものと同じデータをログに記録するだけです。前述のようにサービスがシングルトンの場合、2 つの ID が同じデータを返すことが期待されます。ここで何が間違っていますか? 任意のポインタをいただければ幸いです。

4

1 に答える 1

2

あなたのauthenticationサービスの変更で

identity= response.data;

identity.token=response.data.token;
identity.user=response.data.user;

そして物事はうまくいくはずです。

基本的にあなたがしていることは、identityオブジェクト参照を置き換えることです。

于 2013-09-10T10:50:43.053 に答える