Утилиты

Описание

Служебный функционал, необходимый для работы API карт и разработки собственных модулей.

DG.Class

DG.Class предоставляет возможность использовать ООП подход в разработке функционала API карт, используется для реализации большинства классов, приведенных в этой документации.

Кроме реализации простой классической модели наследования имеются несколько свойств для удобной организации кода, такие как options, includes и statics.

var MyClass = DG.Class.extend({
    initialize: function (greeter) {
        this.greeter = greeter;
        // конструктор класса
    },

    greet: function (name) {
        alert(this.greeter + ', ' + name)
    }
});

// создает объект класса MyClass и передает "Hello" в конструктор
var a = new MyClass("Hello");

// вызывает метод greet, который показывает всплывающее окно с текстом "Hello, World"
a.greet("World");

Наследование

Для определения новых классов используется конструкция DG.Class.extend, также метод extend можно использовать в любом классе, который наследуется от DG.Class:

var MyChildClass = MyClass.extend({
    // ... новые свойства и методы
});

Данный код создаст класс, который наследует все методы и свойства родительского класса (через цепочку прототипов), также возможно добавление или переопределение родительских методов и свойств. Кроме того, корректно обрабатывается оператор instanceof:

var a = new MyChildClass();
a instanceof MyChildClass; // true
a instanceof MyClass; // true

Вы можете вызывать родительские методы (включая конструктор) из потомков (так, как вы бы делали это с помощью вызова super в других языках программирования) с помощью JavaScript функций call или apply:

var MyChildClass = MyClass.extend({
    initialize: function () {
        MyClass.prototype.initialize.call("Yo");
    },

    greet: function (name) {
        MyClass.prototype.greet.call(this, 'bro ' + name + '!');
    }
});

var a = new MyChildClass();
a.greet('Jason'); // выведет "Yo, bro Jason!"

Опции

options — это специальное свойство, которое в отличии от других объектов передаваемых через extend будет слито с аналогичным свойством родителя, вместо полного переопределения, это позволяет управлять конфигурацией объектов и значениями по умолчанию:

var MyClass = DG.Class.extend({
    options: {
        myOption1: 'foo',
        myOption2: 'bar'
    }
});

var MyChildClass = DG.Class.extend({
    options: {
        myOption1: 'baz',
        myOption3: 5
    }
});

var a = new MyChildClass();
a.options.myOption1; // 'baz'
a.options.myOption2; // 'bar'
a.options.myOption3; // 5

Также имеется метод DG.Util.setOptions, который позволяет сливать опции переданные в конструктор с изначально заданными опциями:

var MyClass = DG.Class.extend({
    options: {
        foo: 'bar',
        bla: 5
    },

    initialize: function (options) {
        DG.Util.setOptions(this, options);
        ...
    }
});

var a = new MyClass({bla: 10});
a.options; // {foo: 'bar', bla: 10}

Включения

includes — это специальное свойство, которое подмешивает объекты в класс (такие объекты называются mixin-ами).

 var MyMixin = {
    foo: function () { ... },
    bar: 5
};

var MyClass = DG.Class.extend({
    includes: MyMixin
});

var a = new MyClass();
a.foo();

Также вы можете подмешивать объекты в процессе выполнения программы с помощью метода include:

MyClass.include(MyMixin);

Статика

statics — это свойство, в котором описываются статические элементы класса, удобно использовать для определения констант:

var MyClass = DG.Class.extend({
    statics: {
        FOO: 'bar',
        BLA: 5
    }
});

MyClass.FOO; // 'bar'

Фабрики классов

Для создания новых объектов классов используются фабричные методы, которые имеют такое же название, как и у класса, но начинаются с нижнего регистра. Это аналог ключевого слова new, то есть, данные строки кода эквивалентны:

new DG.Map('map');
DG.map('map');

Реализовать фабричный метод в собственных классах довольно просто, например:

DG.map = function (id, options) {
    return new DG.Map(id, options);
};

Зацепки конструктора

Если вы разрабатываете модуль к API, тогда велика вероятность того, что вам понадобится выполнить дополнительные действия при инициализации объектов существующих классов (например, при инициализации объекта DG.Polyline). Для подобного рода задач имеется метод addInitHook:

MyClass.addInitHook(function () {
    // ... выполнить дополнительные действия при вызове конструктора
    // например, добавить обработчики событий, установить значения свойств и т.п.
});

Также можно использовать сокращенную запись, если необходимо вызвать лишь один метод при инициализации:

MyClass.addInitHook('methodName', arg1, arg2, …);

DG.Browser

Объект со свойствами, необходимыми для определения браузера/фичи, например:

if (DG.Browser.ie6) {
    alert('Вам срочно нужно обновить свой браузер!');
}
Свойство Тип Описание
ie Boolean true для всех версий Internet Explorer.
ie6 Boolean true для Internet Explorer 6.
ie7 Boolean true для Internet Explorer 7.
webkit Boolean true для браузеров на основе WebKit, таких как Chrome и Safari (включая мобильные версии).
webkit3d Boolean true для браузеров на основе WebKit, поддерживающих CSS 3D трансформации.
android Boolean true для мобильных браузеров Android устройств.
android23 Boolean true для мобильных браузеров на старых версиях Android устройств (2 и 3).
mobile Boolean true для браузеров, работающих на современных мобильных устройствах (включая iOS Safari и различные Android устройства).
mobileWebkit Boolean true для мобильных браузеров на основе WebKit.
mobileOpera Boolean true для мобильной версии Opera.
touch Boolean true для всех браузеров, работающих на тач-устройствах.
msTouch Boolean true для браузеров с тач-моделью от Microsoft (например, IE10).
retina Boolean true для устройств с Retina экранами.

DG.Util

Общие служебные методы и свойства.

Методы

Метод Возвращает Описание
extend( <Object> dest, <Object> src?.. ) Object Сливает свойства объекта src (или нескольких объектов) в свойства объекта dest и возвращает последний. Также имеется псевдоним DG.extend.
bind( <Function> fn, <Object> obj ) Function Возвращает функцию, которая выполняет функцию fn с определенным объектом контекста obj (так, чтобы ключевое слово this внутри функции указывало на obj). Также имеется псевдоним DG.bind.
stamp( <Object> obj ) String Применяет уникальный ключ к объекту и возвращает его значение. Полезно для получения быстрого доступа к объекту, находящемуся в группе.
throttle( <Function> fn, <Number> time, <Object> context? ) Function Возвращает обертку над функцией fn, которая гарантирует, что функция не будет вызвана чаще, чем раз в указанный интервал времени time (например, используется при запросах к тайлам во время перетаскивания карты), опционально можно передать контекст (context), в котором будет вызываться функция.
formatNum( <Number> num, <Number> digits ) Number Возвращает число num округленное до digits знаков.
splitWords( <String> str ) String[] Обрезает и разделяет строку на части, используя в качестве разделителя пробел, возвращает массив с этими частями.
setOptions( <Object> obj, <Object> options ) Object Сливает переданные опции со свойством options объекта obj, возвращает результирующий объект. См. опции класса. Также имеется псевдоним DG.setOptions.
getParamString( <Object> obj ) String Преобразует объект в URL-строку, например, {a: "foo", b: "bar"} будет преобразован в '?a=foo&b=bar'.
template( <String> str, <Object> data ) String Простая функция-шаблонизатор, создает строку применяя значения из объекта data в формате {a: 'foo', b: 'bar', …} к строке шаблона в формате 'Hello {a}, {b}' — в этом примере будет возвращена строка 'Hello foo, bar'.
isArray( <Object> obj ) Boolean Возвращает true, если переданный объект является массивом.
trim( <String> str ) String Обрезает пробелы с обеих сторон строки и возвращает результат.

Свойства

Свойство Тип Описание
emptyImageUrl String URI, содержащий пустое GIF изображение, закодированное в base64. Используется для освобождения памяти неиспользуемых картинок в мобильных WebKit браузерах (память освобождается установкой свойства src в данное значение).

DG.Locale

Функционал, с помощью которого осуществляется перевод пользовательского интерфейса.

Подмешивает в карту два метода: setLang и getLang. Также имеется объект DG.Locale, который можно подмешать в любой внешний модуль, после чего в нем появится метод t, с помощью которого можно осуществить перевод. Классы модулей, к которым примешивается DG.Locale должны содержать внутри себя свойство _map и статическое свойство Dictionary.

Базовым для всех словарей является словарь DG.Dictionary, в котором хранятся правила перевода слов во множественные формы (plural rules). При создании модуля, использующего свои словари, необходимо их разместить в папке lang. К примеру, если вы будете использовать итальянский и русский языки, тогда необходимо создать файлы lang/it.js и lang/ru.js. Примеры создания словарей рассмотрены ниже.

Пример использования

Подмешивание (mixin) функционала локализации в модуль:

DG.LocaleExample = DG.Control.extend({
    includes: DG.Locale,
    statics: {
        Dictionary: {}
    }
    ...
}

Подписка на событие langchange:

this._map.on('langchange', this._updateText, this);

Перевод строки на текущий язык карты:

container.innerHTML = this.t("{n} people", 16700000) + ' ' + this.t("regularly use 2GIS");

Создание собственных словарей на итальянском и русском языках:

Cодержимое файла lang/it.js:

DG.LocaleExample.Dictionary.it = DG.extend({
    "{n} people" : ["{n} utente", "{n} utenti"],
    "regularly use 2GIS" : "utilizzano regolarmente 2GIS"
}, DG.Dictionary.it);

Cодержимое файла lang/ru.js:

 DG.LocaleExample.Dictionary.ru = DG.extend({
    "{n} people" : ["{n} пользователь", "{n} пользователя", "{n} пользователей"],
    "regularly use 2GIS" : "регулярно используют 2GIS"
}, DG.Dictionary.ru);

DG.LineUtil

Набор методов для обработки ломаных.

Метод Возвращает Описание
simplify( <Point[]> points, <Number> tolerance ) Point[] Уменьшает количество точек в ломаной и возвращает новую упрощенную ломаную. Позволяет увеличить производительность обработки/отображения ломаных на карте. Параметр tolerance влияет на величину упрощения (чем меньше значение, тем лучше качество геометрии и ниже производительность).
pointToSegmentDistance( <Point> p, <Point> p1, <Point> p2 ) Number Возвращает расстояние между точкой p и сегментом между точками p1 и p2.
closestPointOnSegment( <Point> p, <Point> p1, <Point> p2 ) Point Возвращает ближайшую точку на сегменте p1 p2 до точки p.
clipSegment( <Point> a, <Point> b, <Bounds> bounds ) - Обрезает сегмент a b по прямоугольной области (модифицируются непосредственно точки сегмента).

DG.PolyUtil

Набор методов для обработки точек многоугольников.

Метод Возвращает Описание
clipPolygon( <Point[]> points, <Bounds> bounds ) Point[] Обрезает многоугольник по прямоугольной области.