2016-11-12 13 views
0

からのアクセスプライベート変数私は、次の工場を書いた:AngularJS工場 - メソッド

.factory('UserFact', function() { 
    var user = []; 
    return { 
    'setUser': function(user) { 
    this.user = user; 
     console.log('(1) User set: ' + this.user); 
     console.log('(2) User id is now: ' + this.user.uid); 
    }, 
    'updateSport': function(sportid) { 
    console.log('(3)Update sport ' + sportid + 'for user id ' + this.user.uid); 
    } 
} 

は私のコントローラでそれを次の方法を使用します。

function ($scope, $stateParams, DatabaseFact, UserFact) { 

    // variables 
    $scope.sports = []; 
    $scope.sports = DatabaseFact.getSports(); 

    // functions 
    $scope.updateSport = UserFact.updateSport; 

    // execution 
    UserFact.setUser({uid: '123456', name: 'forrest'}); 
} 

のリストを私の見解から、それをトリガートリガーボタン:

updateSport(sport.id) 

私の問題は、コンソールログで次のように表示されることです。

(1) User set: [Object] Object 
(2) User id is now: 123456 
(3) Update sport 1 for user id undefined 

私のユーザーIDがログ3で定義されていない理由は知っていますか?

おかげ

答えて

0

を呼び出す必要があり、この私はあなたがJavaScriptであるか馴染みのかわからないが、私はあなたがで見破られている疑いがある問題を修正するには

あなたの2つの関数呼び出しではthisの参照が異なります。

これをデバッグするには、thisを両方の機能のコンソールにロギングしてみてください。それらが異なることを観察して、問題の原因を説明してください。

修正プログラムでは、thisというキーワードを使用できない場合があります。機能setUserはなる:

'setUser': function(_user) { 
    user = _user; 
} 

あなたが開始するためにhttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/thisを試し、GoogleでJS thisに関する詳細な情報を見つけることができます。

+0

私はC++とJavaから来ています。 JSで理解するのがずっと難しいJavascriptのスコープで本当に苦労しています... –

0

関数がthisを使用しますが、範囲を基準にした元のオブジェクト(ユーザサービス)からコピーされるので、それは未定義です。

あなたはthisを使用することを停止し、代わりにあなたが宣言したuser変数を使用して、空の配列で初期化(なぜ、ところで?)、しかしどこか他使ったことがない、または

$scope.updateSport = function() { 
    UserFact.updateSport; 
} 

注を行うことができますいずれかあなたのサービスに「UserFact」という名前を付けましたが、これは事実ではありません。それは何も作成しません。ユーザーの設定とスポーツの更新のみが可能です。それは工場ではありません。ファクトリは物を作るために使われるオブジェクトです。ここで、ファクトリはmodule.factory()に渡された関数であり、サービスインスタンスを作成して返すために使用されます。サービスインスタンスはUserServiceと呼ばれるほうがよいでしょう。

+0

私はC++から来て、私はそれらが近づきつつあるタイプの変数を初期化するために使用されています。ここではuserは配列です。あなたは他のことをお勧めしますか?また、工場とサービスの真の違いについて、わかりやすい説明が見つかりませんでしたか?なにか提案を? –

+0

サービスは、コントローラや他のサービスが使用するものです。サービスは、他のサービス、コントローラー、ディレクティブなどで角張って注入されるものです。setUser()メソッドとupdateSport()の2つのメソッドを持つオブジェクトがサービスです。 factory()関数に渡す関数はファクトリです。サービスを作成して返します。 'UserFact.setUser({uid: '123456'、name: 'forrest'});'を呼び出すと、ユーザは配列ではありません。それはオブジェクトです。 –

1

私はその実装の理由から、それは意味があります。あなたのコントローラでは、実際にはメソッドリファレンスを$ scope.updateSportにコピーしています。したがって、メソッドが実行されるたびに、コントローラとthis - > $ scopeインスタンスのコンテキストで実行されますが、サービスインスタンスは1つではありません。

あなたのコントローラーはuidを持っていますので、定義されていません。あなたはupdateSortためのメソッド本体を持っているとUserFact.updateSport

$scope.updateSport = function(){ 
    UserFact.updateSport(); 
} 
関連する問題