2016-10-17 9 views
0

サービスを宣言する正しい方法はどれですか?AnguarJS: 'this'ポインタまたはreturn文を使用

.service('myService', function(myFactory) { 
    myFactory.LoadData("...",function(newData){ 
     this.data= newData; 
    }); 
} 

または

.service('myService', function() { 
    var data= {}; 
    myFactory.LoadData("...",function(newData){ 
     data= newData; 
     return data ; 
    }); 

} 

私は、http私はそれを使用しますが、一度だけ、その後、私はいつでもデータにアクセスするたびに呼び出しを行う必要はありません。

私は最初の例を試しましたが、コントローラで使用しようとすると「未定義」という値が得られます。

編集:ここ

OKが私のコードです:

サービス:

.service('ClassService', function(ClassFactory) {     

       ClassFactory.query(function(rawClasses){ 
        this.classes= []; 
        rawClasses.forEach(function(classe) { 
         var classeRow={}; 
         classeRow.grade=classe.grade; 

         classe.branch.forEach(function(branch) { 
          classeRow._id=branch._id; 
          classeRow.branch= branch.name; 
          classeRow.fees= branch.fees; 

          branch.sub_class.forEach(function(subClass) { 
           classeRow.label=subClass.label; 
           classeRow.name= _getGradeName_(classeRow.grade)+(classeRow.branch || '')+ (subClass.label || ''); 
           console.info('ClasseService hihihi!'); 
           this.classes.push(_byValue_(classeRow)); 
            console.log(this.classes);  

          }, this); 
         }, this);     
        }, this); 
       });  
     }) 

とコントローラ:

.controller('StudentController', function(StudentFactory, ClassService, $scope, $stateParams) { 
    //... 
    $scope.classes= ClassService.classes; 
    //but here console.log($scope.classes) gives 'undefined' 
    //... 
}); 
+0

私の最初の考えはその$のhttp.get上の約束があります。 – Maccurt

+0

ファクトリは、関数を呼び出して戻り値を使用してインスタンス化します。サービスは関数上で 'new'演算子を使用してインスタンス化し、 'this'として参照できる新しいオブジェクトを作成します。 短い答えはどちらかを使用することですが、2番目の方は 'service'ではなく' factory'を使う必要があります。 しかし '$ http.get()'は約束を返しますので、値が到着するのを待つために '.then()'を使う必要があります。 – Duncan

+1

この回答の2番目の例をチェックアウトhttp://stackoverflow.com/a/40087580/4488121 –

答えて

1

あなたのサービスでクエリが実行されています非同期的に、あなたは約束を使用する必要がありますo値が利用可能になるのを待ちます。

ClassFactory.query()がコールバックを使用する代わりに約束を返すようにすると、すべてがはるかに簡単になります。完了を処理するには、ClassServicethePromise.then()を使用しますが、それはコントローラに公開する約束を返します。コントローラでは、別の.then()を使用してデータがいつ利用可能かを知ることができます。

だから、あなたが約束を返すようにClassFactory.query()を更新しました仮定:

.service('ClassService', function(ClassFactory) {     

    var promise =ClassFactory.query(); 
    this.dataLoaded = promise.then(... the code to convert rawClasses to this.classes goes here...); 
}) 

と:

.controller('StudentController', function(StudentFactory, ClassService, $scope, $stateParams) { 
    //... 
    ClassService.dataLoaded.then(function() { 
     $scope.classes= ClassService.classes; 
    }); 
}); 
+0

大丈夫、私はそれを試すことができますが、通常は私はいくつかの 'console.log'とtiを実行したので、私のコードは動作するはずです。ホームページが読み込まれると、 'ClassService'はすべてのデータを取得し、私は 'StudentController'が定義されているページに移動しますが、サービスからそのデータを使用する予定でしたが、データが利用可能であっても' undefined'を表示します。私はなぜ理解していません – Xsmael

+0

あなたはいつも約束を使用すべきです、私はこの答えが何かにあると思います。 – Maccurt

+0

@ Xsmaelあなたのクエリが非同期的に完了するので、コントローラがそれにアクセスできなくなるまでデータが利用できなくなります。しかし、「this」のスコープも問題でした。 – Duncan

関連する問題