サービスを宣言する正しい方法はどれですか?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'
//...
});
私の最初の考えはその$のhttp.get上の約束があります。 – Maccurt
ファクトリは、関数を呼び出して戻り値を使用してインスタンス化します。サービスは関数上で 'new'演算子を使用してインスタンス化し、 'this'として参照できる新しいオブジェクトを作成します。 短い答えはどちらかを使用することですが、2番目の方は 'service'ではなく' factory'を使う必要があります。 しかし '$ http.get()'は約束を返しますので、値が到着するのを待つために '.then()'を使う必要があります。 – Duncan
この回答の2番目の例をチェックアウトhttp://stackoverflow.com/a/40087580/4488121 –