Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save zobzn/8f337012b76f65c23a4d to your computer and use it in GitHub Desktop.
Save zobzn/8f337012b76f65c23a4d to your computer and use it in GitHub Desktop.
События загрузки данных у RemoteObjectManager Яндекс.Карт
// @see https://yandex.ru/blog/mapsapi/54098
// свой загрузчик данных для RemoteObjectManager
// отличия от базового — генерируется события загрузки данных: dataloadbefore и dataloadafter
ymaps.modules.define('objectManager.component.ReloadOnZoomChangeControllerWithEvents', [
'util.defineClass',
'objectManager.component.ReloadOnZoomChangeController'
], function (provide, defineClass, ReloadOnZoomChangeController) {
var ReloadOnZoomChangeControllerWithEvents = function (remoteObjectManager) {
ReloadOnZoomChangeControllerWithEvents.superclass.constructor.call(this, remoteObjectManager);
};
defineClass(ReloadOnZoomChangeControllerWithEvents, ReloadOnZoomChangeController, {
loadData: function (tilesArray) {
// отправляем событие начала загрузки данных
this.events.fire('dataloadbefore');
ReloadOnZoomChangeControllerWithEvents.superclass.loadData.call(this, tilesArray);
},
onDataLoad: function (tilesArray, data) {
ReloadOnZoomChangeControllerWithEvents.superclass.onDataLoad.call(this, tilesArray, data);
// отправляем событие окончания загрузки данных
this.events.fire('dataloadafter');
}
});
provide(ReloadOnZoomChangeControllerWithEvents);
});
// свой RemoteObjectManager
// пересылает события от загрузчика данных dataloadbefore и dataloadafter
ymaps.modules.define('CustomRemoteObjectManager', [
'util.defineClass',
'RemoteObjectManager',
'objectManager.component.ReloadOnZoomChangeControllerWithEvents'
], function (provide, defineClass, RemoteObjectManager, ReloadOnZoomChangeControllerWithEvents) {
var CustomRemoteObjectManager = function (urlTemplate, options) {
CustomRemoteObjectManager.superclass.constructor.call(this, urlTemplate, options);
};
defineClass(CustomRemoteObjectManager, RemoteObjectManager, {
_setupDataLoadController: function () {
// т.к. на событие подписываемся уже после инициализации ReloadOnZoomChangeControllerWithEvents
// то первое событие dataloadbefore мы уже не успеваем поймать, поэтому вызываем его вручную
this._onDataLoadBefore();
// указываем наш новый загрузчик, который может генерировать нужные события загрузки данных
this._dataLoadController = new ReloadOnZoomChangeControllerWithEvents(this);
this._dataLoadControllerListener = this._dataLoadController.events.group()
.add('statechange', this._onDataLoadControllerStateChange, this)
.add('pixelboundschange', this._onDataLoadControllerBoundsChange, this)
// будем просто забирать себе эти новые события загрузки данных
.add('dataloadbefore', this._onDataLoadBefore, this)
.add('dataloadafter', this._onDataLoadAfter, this);
},
_onDataLoadBefore: function () {
// просто перегенерируем событие как свое
this.events.fire('dataloadbefore');
},
_onDataLoadAfter: function () {
// просто перегенерируем событие как свое
this.events.fire('dataloadafter');
}
});
provide(CustomRemoteObjectManager);
});
// используем новый CustomRemoteObjectManager :-)
ymaps.modules.require(['CustomRemoteObjectManager'], function (CustomRemoteObjectManager) {
var map, remoteObjectManager;
remoteObjectManager= new CustomRemoteObjectManager(...);
remoteObjectManager.events.add('dataloadbefore', function () {
console.log('грузим данные');
});
remoteObjectManager.events.add('dataloadafter', function () {
console.log('данные загружены');
});
map = new ymaps.Map(...);
map.geoObjects.add(remoteObjectManager);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment