2017-08-04 5 views
2

私ははUserTokenが定義されていないAngular.js 1.6.5のangle-ui-router 0.4.1.3で同じファイルに別々に保持されている場合、コールバック関数はスコープを変更しますか?

としてエラーを受け取りますが、私は自分のアプリケーションのindex.jsに初期化さ工場のような、

app.factory('userToken', function(){ 
    return { 
    foo : function() { 
     var authToken = "poop" 
     return authToken 
    } 
    } 
}) 

app.run(['$rootScope', '$state', 'userToken', main]) 

function main ($rootScope, $state, userToken) { 
    console.log(userToken.foo()) 
    $rootScope.$on('$stateChangeStart', isAuth) 
} 

function isAuth (event, toState, toParams, fromState, fromParams) { 
    console.log("%%%%%%%%%%%%%", userToken.foo()) /* UserToken not defined */ 
} 

を持っています。

完全に理解できます。だから私は、isAuth関数パラメータのようなではUserToken、

function isAuth (event, toState, toParams, fromState, fromParams, userToken) { 
console.log("%%%%%%%%%%%%%", userToken.foo()) 
} 

を定義しかし、これを実行した後、私は

が未定義のFOO()を得ることができないというエラーを取得します。

この混乱の末、コールバックパラメータを$ rootscopeのすぐ隣に追加しました。イベントに&、

function main ($rootScope, $state, userToken) { 
    console.log(userToken.foo()) 
    $rootScope.$on('$stateChangeStart', function (event, 
    toState,toParams,fromState, fromParams /* Removed userToken */) { 
     console.log("%%%%%%%%%%%%%", userToken.foo()) 
    }) 
} 

とコンソール

うんちで印刷得たものと思います。

%%%%%%%うんち

私が直接、コールバックにそれを追加する場合にのみ私の質問は、なぜそれが印刷したのか?なぜ私はその名前で関数を呼び出す前に、別のままにしている間にisAuth

userTokenが範囲外であったため、定義されていない以前にエラーが発生しましたが、今は問題なく動作しました。

答えて

2

工場では、userTokenが角で作成され、main機能に注入されます。この機能では、好きな場所でuserToken工場にアクセスできます。あなたの最初の例isAuth

main関数の外で定義されているので、もはやuserToken工場へのアクセスを持っていません。

実際の例では、関数はまだmain関数と同じスコープにあり、関数mainの変数にアクセスできます。

+0

これは、実行時にuserTokenが注入され、メイン関数内でそれを保持していても、isAuthコールバックにのみアクセスできることを意味します。 –

+0

はい、それはあなたがコントローラ、ディレクティブ、別の工場にそれを注入すると、それにアクセスすることもできます –

関連する問題