-
Notifications
You must be signed in to change notification settings - Fork 83
/
Copy pathcollection-search-provider.js
57 lines (51 loc) · 2.35 KB
/
collection-search-provider.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Провайдер данных для элемента управления ymaps.control.SearchControl.
// Осуществляет поиск геообъектов в по массиву points.
// Реализует интерфейс IGeocodeProvider.
function CustomSearchProvider(points) {
this.points = points;
}
// Провайдер ищет по полю text стандартным методом String.ptototype.indexOf.
CustomSearchProvider.prototype.geocode = function (request, options) {
var promise = new ymaps.util.Promise(),
geoObjects = new ymaps.GeoObjectArray(),
// Сколько результатов нужно пропустить.
offset = options.skip || 0,
// Количество возвращаемых результатов.
limit = options.results || 20,
i = 0, l = 0;
// Ищем в свойстве text каждого элемента массива.
// При формировании ответа можно учитывать offset и limit.
this.points.forEach(function (point) {
var text = point.text,
coords = point.coords;
if(~text.toLowerCase().indexOf(request.toLowerCase()) && i++ >= offset && l < limit) {
geoObjects.add(new ymaps.Placemark(coords, {
name: text + ' name',
description: text + ' description',
balloonContentBody: '<p>' + text + '</p>',
boundedBy: [coords, coords]
}));
l++;
}
});
var response = {
// Геообъекты поисковой выдачи.
geoObjects: geoObjects,
// Метаинформация ответа.
metaData: {
geocoder: {
// Строка обработанного запроса.
request: request,
// Количество найденных результатов.
found: geoObjects.getLength(),
// Количество возвращенных результатов.
results: limit,
// Количество пропущенных результатов.
skip: offset
}
}
};
promise.resolve(response);
// Возвращаем объект-обещание.
return promise;
};