Jak powinienem czekać na załadowanie wielu sklepów? Mam przypadek, w którym muszę wykonać pewną pracę tylko wtedy, gdy załadowane są dwa różne sklepy, więc używanie store.on("load", fn)
jednego sklepu nie jest wystarczająco dobre.ExtJS czeka na załadowanie wielu sklepów
Odpowiedz
myślę można dodać słuchaczy obciążenia zarówno dla sklepów, i sprawdzić, czy ten drugi zakończył ...
this.getStore('store1').on('load',function(store){
if (this.getStore('store2').isLoading() == false){
// callMethod to perform action ....
}
},this);
this.getStore('store2').on('load',function(store){
if (this.getStore('store1').isLoading() == false){
// callMethod to perform action....
}
},this);
myślę w ten sposób będzie to nazwać metodę tylko wtedy, gdy oba są ładowane przy założeniu, że ciebie wiem, że wniosek o obciążenie został złożony dla obu.
Mam kilka projektów, które wymagały załadowania kilku sklepów przed rozpoczęciem pracy z danymi. Dodałem do nich wywołanie zwrotne, aby sprawdzić, czy każdy element w Ext.data.StoreManager
został załadowany, a jeśli tak, to zrobiłby to, co było mi potrzebne w danych.
Aby dodać sklepów do StoreManager po prostu trzeba dać mu storeId
w config, coś takiego:
var store1 = Ext.create('Ext.data.Store', {
model: myModel,
storeId: 'store1', //<-- adds this to Ext.data.StoreManager
proxy: {
type: 'ajax',
url: 'url...',
reader: 'json'
},
autoLoad: {
callback: initData
}
});
var store2 = Ext.create('Ext.data.Store', {
model: myModel,
storeId: 'store2',
proxy: {
type: 'ajax',
url: 'url...',
reader: 'json'
},
autoLoad: {
callback: initData
}
});
// Initialize store dependencies when all stores are loaded
function initData() {
var loaded;
Ext.data.StoreManager.each(function(store) {
loaded = !store.isLoading();
return loaded;
});
if(loaded) {
// do stuff with the data
}
}
Nie jasne, ale myślę, że downvote wynikało z 'loaded =! store.isLoading();', które powinno być 'loaded & =! store.isLoading();'. Zobacz to [jsfiddle] (http://jsfiddle.net/JHMzp/1). W każdym razie powinien istnieć komentarz, aby nam wszystkim pomóc :) – aletzo
Zwykle uniknąć problemu, bo staramy się zminimalizować roundtrips klient/serwer i poprawy wydajności : Ustawię autoLoad na false w sklepie, a następnie wykonaj jawne żądanie ajax, które pobiera dane dla wszystkich sklepów jednocześnie, a następnie użyj store.loadData(), aby bezpośrednio ustawić je w każdym sklepie. Minusem jest oczywiście to, że wymaga więcej kodu i skutkuje ściślejszym sprzężeniem.
Używamy tego gdy istnieje kilka sklepów, aby czekać na:
Ext.define('Ext.ux.StoreLoadCoordinator', {
mixins: {
observable: 'Ext.util.Observable'
},
resetStoreLoadStates: function() {
this.storeLoadStates = {};
Ext.each(this.stores, function(storeId) {
this.storeLoadStates[storeId] = false;
}, this);
},
isLoadingComplete: function() {
for (var i=0; i<this.stores.length; i++) {
var key = this.stores[i];
if (this.storeLoadStates[key]==false) {
return false;
}
}
return true;
},
onStoreLoad: function(store, records, successful, eOpts, storeName) {
this.storeLoadStates[store.storeId] = true;
if (this.isLoadingComplete()==true) {
this.fireEvent('load');
this.resetStoreLoadStates();
}
},
constructor: function (config) {
this.mixins.observable.constructor.call(this, config);
this.resetStoreLoadStates();
Ext.each(this.stores, function(storeId) {
var store = Ext.StoreManager.lookup(storeId);
store.on('load', Ext.bind(this.onStoreLoad, this, [storeId], true));
}, this);
this.addEvents(
'load'
);
}});
Aby go użyć, należy przekazać w tablicy odpowiednich storeIds:
var store1 = Ext.create('Ext.data.Store', {
storeId: 'Store1',
.... (rest of store config)
}});
var store2 = Ext.create('Ext.data.Store', {
storeId: 'Store2',
.... (rest of store config)
}});
var coordinatior = Ext.create('Ext.ux.StoreLoadCoordinator', {
stores: ['Store1', 'Store2'],
listeners: {
load: function() {
// Do post-load work
}
}
});
to daje pojedynczy ładunek zdarzenie do obsługi dla wielu sklepów. Należy pamiętać, że wymaga to rozszerzenia 4.x lub nowszego.
Świetnie! Dziękuję Ci – Black
Używam sklepów z ładowaniami łańcuchowymi, aby rozwiązać ten problem.
Minusy: wolniej niż być powinno.
chainStoreLoad :function (stores, lastCall, idx)
{
if (idx === stores.length) {
if ("function" === typeof lastCall) {
lastCall.call();
}
return;
}
stores[idx].load (function (r,o,s) {
Jx.chainStoreLoad (stores, lastCall, idx + 1);
});
}
Przykład:
Jx.chainStoreLoad (
[
this.storeAssetType
, this.storeAssetProcurement
, this.storeAssetStatus
, this.storeAssetLocation
, this.storeSystemUser
]
, function()
{
self.panel.doRefresh (perm);
}
, 0);
- 1. Jak czekać na załadowanie wszystkich sklepów w ExtJs?
- 2. Użyj interfejsu API odpoczynku Magento z widokiem wielu sklepów
- 3. Czy body.onload czeka na IFrames?
- 4. Reaktor Router czeka na rozwiązanie
- 5. Async MVVM czeka na wzór
- 6. Lista sklepów do sesji
- 7. Internet Explorer czeka na localhost na zawsze
- 8. Zakresy sklepów IP w Redis
- 9. Blackberry Realizacja Naciśnij i czeka na potwierdzenie
- 10. Python nie czeka na zakończenie MATLABA
- 11. Jenkins nie czeka na polecenia Docker skończyć
- 12. Praca Jenkins czeka na następny dostępny executor
- 13. czeka na wiele zmiennych warunkowych w boost?
- 14. Czy Selenium czeka na zakończenie JavaScript?
- 15. Czy aplikacja ng czeka na dokument?
- 16. Skrypt Bash nie czeka na odczyt
- 17. sp_who2 Proces śpiania BlkBy czeka na polecenie
- 18. Napisz metodę asynchroniczną, która czeka na bool
- 19. Określanie, które obiekty ZwWaitForMultipleObjects czeka na
- 20. Kątomierz czeka na element w DOM
- 21. Studio wizualne zajęte czeka na wewnętrzną operację
- 22. Czy funkcja java.awt.Robot.waitForIdle() czeka na wysłanie zdarzeń?
- 23. Najlepszy sposób na załadowanie zdjęć do pamięci?
- 24. Poczekaj na załadowanie obrazu, zanim przejdziesz dalej.
- 25. Jak zmechanizować oczekiwanie na załadowanie strony internetowej?
- 26. Poczekaj na załadowanie iframe w JavaScript
- 27. Selenium WebDriver: Jak czekać na załadowanie iFrames?
- 28. Oczekiwanie na załadowanie okna dziecięcego do końca
- 29. extJs gmappanel wewnątrz portalu extJs
- 30. Architektura ExtJS dla aplikacji wielostronicowej
Podobne do http://stackoverflow.com/questions/11003605/how-to-wait-until-all-stores-are-loaded-in-extjs – Patrick