Bazı eşzamansız verilerle başlatmak istediğiniz bir AngularJS hizmetim var. Bunun gibi bir şey:
myModule.service('MyService', function($http) {
var myData = null;
$http.get('data.json').success(function (data) {
myData = data;
});
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
}
};
});
Açıkçası bu işe yaramaz çünkü bir şey geri doStuff()
dönmeden önce aramaya çalışırsa myData
bir boş işaretçi istisnası alırım. Burada ve burada sorulan diğer soruları okuyarak söyleyebildiğim kadarıyla birkaç seçeneğim var, ancak hiçbiri çok temiz görünmüyor (belki de bir şey eksikim):
"Run" ile Kurulum Hizmeti
Uygulamamı kurarken bunu yapın:
myApp.run(function ($http, MyService) {
$http.get('data.json').success(function (data) {
MyService.setData(data);
});
});
Sonra benim hizmet şöyle görünecektir:
myModule.service('MyService', function() {
var myData = null;
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
}
};
});
Bu zaman zaman işe yarar, ancak eşzamansız veriler her şeyin başlatılması için gereken süreden daha uzun sürerse, aradığımda boş bir işaretçi istisnası alıyorum doStuff()
Vaat nesneleri kullanma
Bu muhtemelen işe yarar. MyService dediğim her yerde tek dezavantajı doStuff () bir söz verdiğini ve tüm kodun then
söz ile etkileşime girmek için bize bilmek zorunda kalacak . Ben sadece benim uygulama yüklemeden önce myData geri kadar beklemek istiyorum.
Manuel Önyükleme
angular.element(document).ready(function() {
$.getJSON("data.json", function (data) {
// can't initialize the data here because the service doesn't exist yet
angular.bootstrap(document);
// too late to initialize here because something may have already
// tried to call doStuff() and would have got a null pointer exception
});
});
Global Javascript Var JSON'umu doğrudan global Javascript değişkenine gönderebilirim:
HTML:
<script type="text/javascript" src="data.js"></script>
data.js:
var dataForMyService = {
// myData here
};
Sonra başlatırken kullanılabilir olacaktır MyService
:
myModule.service('MyService', function() {
var myData = dataForMyService;
return {
doStuff: function () {
return myData.getSomeData();
}
};
});
Bu da işe yarayacaktı, ama sonra kötü kokan küresel bir javascript değişkenim var.
Bunlar benim tek seçeneklerim mi? Bu seçeneklerden biri diğerlerinden daha mı iyi? Bunun oldukça uzun bir soru olduğunu biliyorum, ama tüm seçeneklerimi keşfetmeye çalıştığımı göstermek istedim. Herhangi bir rehberlik büyük mutluluk duyacağız.
$http
, daha sonra verileri bir servise kaydetmek, ardından bir uygulamayı önyüklemek için eşzamansız olarak kod boyunca yürür .