Options
All
  • Public
  • Public/Protected
  • All
Menu

Namespace PageAppManager

Содержание

  1. AppManager и основное использование
  2. Открытие формы
  3. Несколько форм и навигация
  4. Навигация (другой способ)

1. AppManager и основное использование

Замените содержимое simple.ts из примера в статье "Начало работы" следующим содержанием и пресоберите приложение:

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

import { AppManager } from "ui-organizer";//Импортируем объект - AppManager
import type {IForm, IElement} from "ui-organizer";

export let form: IForm = <IForm>{//Описываем форму
    type: 'IForm',
    name: 'simpleForm',
    elements: [
        <IElement>{
            type: 'IElement',
            value: 'Элемент'
        }
    ]
}

var Global: any = window;
Global.AppManager = AppManager; //Передаем AppManager на глобальный уровень для доступа к нему из любого места приложения
Global.onpopstate = AppManager.onPopState; //Переопределяем функцию для возможности навигации между формами

AppManager.init(document.querySelector('#app'))//Инициализирум приложение и устанавливаем корневой HTMLElement для приложения
    .then(()=>{
        AppManager.add([form]);//Добавляем форму в список форм приложения
        AppManager.open(form.name, {});//Открываем форму и передаем ей пустые данные
    })

Первое, мы импортируем объект AppManger из библиотеки ui-organizer:

import { AppManager } from "ui-organizer";

Заметьте, что импортируем именно объект AppManager. Поэтому, создается только одно приложение на странице.

Второе, мы объявляем объект AppManager на глобальном уровне:

var Global: any = window;
Global.AppManager = AppManager; 
Global.onpopstate = AppManager.onPopState; 

Это необходимо для того, чтобы иметь доступ к объекту из любой части программы, а также из консоли браузера для отладки. Например, в консоли вы можете написать следующий код для просмотра данных элемента управления: AppManager.activeForm.getElement('myList').getData();

Для навигации между формами, вам нужно переопределить метод onpopstate.

Без этого второго акта приложение запустится, но мы настоятельно рекомендуем его выполнять.

Третье, инициализируем приложение, указываем HTML элемент, в который встроим нашу форму:

AppManager.init(document.querySelector('#app'))

После открытия формы получим следующий HTML, где все, начиная с <div class="ui-app">, построит программа:

<body>
    <div id="app">
        <div class="ui-app fullViewPort" id="adab641f">
            <form class="app ui-form vertical flexible focused" id="a00b920b" name="simpleForm" tabindex="-1">
                <div class="app ui-element fixed" id="a436ca1c">Элемент</div>
            </form>
        </div>
    </div>
</body>

Четвертое, добавляем форму в приложение - передаем в метод add() массив объектов с описанием форм:

AppManager.add([form]);

Пятое, открываем форму:

AppManager.open(form.name, {});

2. Открытие формы

В предыдущем разделе мы открыли форму следующим образом:

AppManager.open(form.name, {});

В следующем примере используются три метода:

  • AppManager.load(),
  • AppManager.setData(),
  • AppManager.activate().

Результат получаем тот же самый, что и в первом разделе.

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

import { AppManager } from "ui-organizer";//Импортируем объект - AppManager
import type {IForm, IElement} from "ui-organizer";

export let form: IForm = <IForm>{//Описываем форму
    type: 'IForm',
    name: 'simpleForm',
    elements: [
        <IElement>{
            type: 'IElement',
            value: 'Элемент'
        }
    ],
    async onBeforeLoad(event, form, elem) {
        console.log(event.data);
    },
    async onBeforeSetData(event, form, elem) {
        console.log(event.data);
    }
}

var Global: any = window;
Global.AppManager = AppManager; //Передаем AppManager на глобальный уровень для доступа к нему из любого места приложения
Global.onpopstate = AppManager.onPopState; //Переопределяем функцию для возможности навигации между формами

AppManager.init(document.querySelector('#app'))//Инициализирум приложение и устанавливаем корневой HTMLElement для приложения
    .then(()=>{
        AppManager.add([form]);//Добавляем форму в список форм приложения
        setTimeout(async () => {
            await AppManager.load(form.name, { data: "loadform" });//Загружаем форму
            setTimeout(async () => {
                await AppManager.setData(form.name, { data: "setdata" });//Устанаваливаем данные
                setTimeout(() => {
                    AppManager.activate(form.name);//Включаем видимость
                }, 1000);
            }, 1000);
        });
    })

Задержку setTimeout() мы использовали для того, чтобы показать последовательное выполнение этих методов.

В результате выполнения AppManager.load() вызывается метод onBeforeLoad и в консоли мы выводим данные, переданные в метод load.

Через секунду, в результате выполнения AppManager.setData(), вызывается метод onBeforeSetData и в консоли мы выводим данные, переданные в метод setData.

Еще через секунду, в результате выполнения AppManager.activate(), форма отображается.

ПРИМЕЧАНИЕ! Данные, переданные в метод AppManager.load() доступны только в onBeforeLoad и onAfterLoad. В форму не устанавливаются.

3. Несколько форм и навигация между ними

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import { AppManager } from "ui-organizer";//Импортируем объект - AppManager
import type { IForm, IElement } from "ui-organizer";

export let form: IForm = <IForm>{//Описываем форму один
    type: 'IForm',
    name: 'simpleForm',
    caption: 'Форма один',
    elements: [
        <IElement>{
            type: 'IElement',
            value: 'Двойной клик, чтобы редактировать',
            bordered: true,
            async onDblClick(){
                this.edit();
            }
        },
        <IElement>{
            type: 'IElement',
            value: 'Клик, чтобы открыть форму два',
            bordered: true,
            async onClick(){
                AppManager.activate(form2.name);;//Активируем форму два
            }
        }
    ]
}

export let form2: IForm = <IForm>{//Описываем форму два
    type: 'IForm',
    name: 'secondForm',
    caption: 'Форма два',
    elements: [
        <IElement>{
            type: 'IElement',
            value: 'Двойной клик, чтобы редактировать',
            bordered: true,
            async onDblClick(){
                this.edit();
            }
        },
        <IElement>{
            type: 'IElement',
            value: 'Клик, чтобы вернуться',
            bordered: true,
            async onClick(){
                AppManager.activate(form.name);//Активируем форму один
            }
        }
    ]
}

var Global: any = window;
Global.AppManager = AppManager; //Передаем AppManager на глобальный уровень для доступа к нему из любого места приложения
Global.onpopstate = AppManager.onPopState; //Переопределяем функцию для возможности навигации между формами

AppManager.init(document.querySelector('#app'))//Инициализирум приложение и устанавливаем корневой HTMLElement для приложения
    .then(async ()=>{
        AppManager.add([form, form2]);//Добавляем формы в список форм приложения
        await AppManager.load(form.name, {})//Загружаем форму один   
        await AppManager.load(form2.name, {});//Загружаем форму два

        AppManager.activate(form.name);//Активируем (включаем видимость) форму один
    })

Мы создали две формы form и form2. Первый элемент в каждой форме для демонстрации сохранения данных формы, второй элемент для переключения между формами.

Обе формы для открытия другой формы используют метод AppManager.activate().

Это возможно, потому что мы заранее загрузили обе формы:

    await AppManager.load(form.name, {})//Загружаем форму один   
    await AppManager.load(form2.name, {});//Загружаем форму два

4. Навигация (другой способ)

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

import { AppManager } from "ui-organizer";//Импортируем объект - AppManager
import type {IForm, IElement} from "ui-organizer";

export let form: IForm = <IForm>{//Описываем форму один
    type: 'IForm',
    name: 'simpleForm',
    caption: 'Форма один',
    elements: [
        <IElement>{
            type: 'IElement',
            value: 'Двойной клик, чтобы редактировать',
            bordered: true,
            async onDblClick(){
                this.edit();
            }
        },
        <IElement>{
            type: 'IElement',
            value: 'Клик, чтобы открыть форму два',
            bordered: true,
            async onClick(){
                AppManager.open(form2.name, {}, this.form);//Открываем форму два
            }
        }
    ]
}

export let form2: IForm = <IForm>{//Описываем форму два
    type: 'IForm',
    name: 'secondForm',
    caption: 'Форма два',
    elements: [
        <IElement>{
            type: 'IElement',
            value: 'Двойной клик, чтобы редактировать',
            bordered: true,
            async onDblClick(){
                this.edit();
            }
        },        
        <IElement>{
            type: 'IElement',
            value: 'Клик, чтобы вернуться',
            bordered: true,
            async onClick(){
                AppManager.back();//Возвращаемся к форме один
            }
        }
    ]
}

var Global: any = window;
Global.AppManager = AppManager; //Передаем AppManager на глобальный уровень для доступа к нему из любого места приложения
Global.onpopstate = AppManager.onPopState; //Переопределяем функцию для возможности навигации между формами

AppManager.init(document.querySelector('#app'))//Инициализирум приложение и устанавливаем корневой HTMLElement для приложения
    .then(async ()=>{
        AppManager.add([form, form2]);//Добавляем формы в список форм приложения
        AppManager.open(form.name, {}); //Открываем форму один и передаем ей данные
    })

Мы создали две формы form и form2. Первый элемент в каждой форме для демонстрации сохранения данных формы, второй элемент для переключения между формами.

В первой форме клик по элементу вызывает открытие формы два:

AppManager.open(form2.name, {}, this.form);//Открываем форму два

Во второй форме клик по элементу вызывает команду "Назад" в истории браузера:

AppManager.back();//Возвращаемся к форме один

Именно для этого мы переопределили метод onpopstate, заменив его на AppManager.onPopState.

Обратите внимание, что навигация между формами идентична разделу три. Это потому, что вызов метода AppManger.open() не загружает каждый раз форму заново, а проверяет в списке уже загруженных. И метод AppManager.back() также вызывает метод активации формы, сохраненной в истории браузера.

Но, во втором способе, описанном в этом разделе, мы можем каждый раз передавать данные открываемой форме.

Generated using TypeDoc