Перейти к содержанию

DataAdapter#

DataAdapter - класс, представляющий сущность-посредник для доступа к данным.

DataAdapter можно использовать в качестве источника данных как для самой формы, так и для ее элементов. Для этого необходимо создать потомка DataAdapter как минимум с одним методом load, который возвращает Deferred-объект. Таким образом, можно возвращать как предопределенный набор данных, так и загруженные данные с помощью ajax-запросов.

Загрузка данных для формы#

Для использования в качестве источника данных формы необходимо, чтобы свойство класса формы binding возвращало потомка класса DataAdapter с методом load. В качестве возвращаемых данных может быть объект или массив. Загруженные данные преобразуются в observable и доступны через свойство data формы.

Приведём несколько способов загрузка данных. Возвращаемые данные:

1
2
3
4
const data = {
  name: 'Новостная лента',
  description: 'Эта страница для новостей'
}

В примере ниже реализация адаптера прямо в классе форы.

Пример. Описание в файле класса формы
import { Form, DataAdapter } from 'ecosoft-lexema8'

export default class TestForm extends Form {
    constructor(args) {
        super(args);
        console.log(this.data); // вернет observable объект с данными
    }

    static get binding() {
        return class TestData extends DataAdapter {
            load() {
                return $.Deferred().resolve(data);
            }
        }
    }

    //...
}

В примере ниже, реализация адаптера вынесена в отдельный модуль.

Пример. Импорт из другого файла
import { Form } from 'ecosoft-lexema8'
import TestDataAdapter from './testDataAdapter'

export default class TestForm extends Form {
    constructor(args) {
        super(args);
        console.log(this.data); // вернет observable объект с данными
    }

    static get binding() {
        return TestDataAdapter;
    }

    //...
}
1
2
3
4
5
6
7
import { DataAdapter } from 'ecosoft-lexema8'

export default TestDataAdapter extends DataAdapter {
    load() {
        return $.Deferred().resolve(data);
    }
}

Загрузка данных для Lookup#

Для использования в качестве источника данных контрола Lookup необходимо описать класс потомка DataAdapterа с методом load. В следующем примере в качестве источника данных контрола Lookup задается предопределенный набор данных.

Пример. Загрузка фиксированного значения
import $ from 'jquery'
import { DataAdapter } from 'ecosoft-lexema8'

export default class Gender extends DataAdapter {
    load() {
        return $.Deferred().resolve([{
            id: 1,
            name: 'мужской'
        }, {
            id: 2,
            name: 'женский'
        }]);
    }
}

Задание источника данных lookup:

<Lookup ... dataSource="./gender"/>

Если данные загружаются с помощью ajax-запросов, то метод load должен вторым параметром принимать флаг isAsync (этот флаг определяет как загружать данные: синхронно или асинхронно), который необходимо использовать в параметрах ajax-запроса (свойство async). Это свойство позволяет в эдиторе колонки грида устанавливать значение по коду до загрузки источника данных лукапа.

Пример. Загрузка с помощью ajax-запросов
import $ from 'jquery'
import { DataAdapter } from 'ecosoft-lexema8'

export default class SystemUsers extends DataAdapter {
    load(options, isAsync) {    
        return $.ajax({
            url: '/api/v1.0/account/1/users',
            async: isAsync, //используем переданный параметр isAsync
            method: 'GET'
        });
    }
}

Реестр на запросе#

Пример реестра на запросе
import { Registry, QuerySource, DataAdapter, ModelSource } from 'ecosoft-lexema8'
import binding from './myModel.model.json'
import myQuery from '../queries/myQuery.query.json'


class CustomAdapter extends DataAdapter {
    constructor (args) {
        super(args)
        this._model = new ModelSource(binding)
        this._source = new QuerySource(myQuery)
    }

    genPrimaryKey () {
        return this._model.genPrimaryKey()
    }

    load (args) {
        return this._source.load(args).then((data) => {
            return (args && args.VCode) ? data[0] : data         
        })
    }

    static get primaryKeyProperty () {
        return 'VCode'
    }

    remove ({ VCode }) {
        return this._model.remove({ VCode })
    }
}

export default class ProjectRegistry extends Registry {
    constructor (args) {
        super(args)
    }

    static get binding () {
        return CustomAdapter 
    }

    //..

}
select * from [dbo].[Contractor]
WHERE (@VCode IS NULL OR VCode = @VCode);