1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Tech_Query-EasyWebApp

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
ReadMe.md

Декларативный движок MVVM — EasyWebApp v4

Основан на загрузчике AMD, jQuery v3.2+ и поддерживает IE bk 9+, ECMAScript 5+ и HTML 5+

Узнать больше с помощью демо Присоединяйтесь к обсуждению на https://gitter.im/EasyWebApp-js/Lobby

Поддержать проект

[Нативный шаблон]

Шаблон EWA полностью следует стандартным семантикам различных нативных веб-технологий ——

  • UI структура: стандартные теги HTML 5+, data-* пользовательские атрибуты

  • Данные: текст и атрибуты HTML-тегов, содержащие шаблоны ECMAScript 6 (например ${view.propX})

  • События: привязка функций аналогично привязке данных

  • Загрузка ресурсов: HTTP URL с параметрами, автоматическое обработки относительных путей

Движок MVVM автоматически загружает HTML и JSON, сканируя DOM-дерево, чтобы построить дерево VM. Разработчики могут сосредоточиться на обработке данных и привязке событий, не требуя локальной компиляции или сборки, и наслаждаться низкой стоимостью обучения при использовании нативного HTML и JavaScript.## 【Разделяемые представления】

ViewModel представляет View (HTML/DOM) на основе модели "данных-ориентированного" программирования ——

  1. Все HTML-структуры View должны быть расположены в единственном контейнерном элементе для удобства привязки VM

  2. В любой момент времени контейнер View может быть привязан только к одному объекту VM

  3. При рендеринге VM проверяет типы данных JavaScript, автоматически соответствует HTML-атрибутам и DOM-объектам, указанным в шаблоне HTML

  4. Функции обратного вызова стандартных событий DOM и пользовательских событий VM также привязываются к View как часть данных, без необходимости специальных API

  5. HTML-теги контейнера View относятся к структуре верхнего View, но привязанная к нему VM слушает изменения данных в пользовательских атрибутах data-*=""

  6. Если нет других ссылок на VM или контейнер, которые были отвязаны или удалены, весь View будет автоматически удален сборщиком мусора

Встроенные объекты представлений

API документация

Конструкторы всех этих представлений доступны в пространстве имен $.fn.iWebApp и могут использоваться без инициализации экземпляра WebApp().

Быстрые методы jQuery

  • Создание представления: $('selector of view').view(Class_Name, iScope)
  • Поиск представления: $(':view', Root_DOM).view()

[Декларативный AJAX]Допустимые HTTP URL следующего формата будут пониматься EWA-движком —

path/to/template.html?key1=value1&keyN=valueN&data=/path/to/json

path/to/template.html и /path/to/json будут загружаться параллельно, а {key1: value1, keyN: valueN} станут частью начальных данных VM для template.html.

(0) Загрузка страницы

<a target="_blank" href="path/to/outer.html">
    Открыть внешнюю страницу в новом окне (перекрестная ссылка по умолчанию открывается в новом окне)
</a>
<a href="path/to/static.html">
    Статическая SPA-страница
</a>
<a href="path/to/template.html">
    Шаблон без начальных данных
</a>
<a href="path/to/template.html?data=/path/to/json">
    Инициализация шаблона одной порцией данных
</a>
<a href="path/to/template.html?key1=value1&keyN=valueN&data=/path/to/json">
    Инициализация шаблона одной порцией данных и передача некоторых параметров
</a>
<div id="PageBox"></div>
<script>
    $('#PageBox').iWebApp('//api.test.com/v1');
</script>

SPA-страница всегда загружается в элементе, где инициализируется экземпляр WebApp.

(1) Отправка формы

<form method="put" enctype="application/json" action="?data=/path/to/submit">
    <input type="hidden" name="extraParam" />

    <input type="text" name="key1" required /> Введено ${view.key1.length} символов

    <input type="submit" />
</form>
  • Атрибут method поддерживает общие HTTP-методы, используемые в RESTful API
  • Атрибут enctype поддерживает общие MIME-типы, используемые в стандарте MIME-Type
  • Проверка данных формы: полностью зависит от HTML 5 Form API### (2) Включение компонентов
<div data-href="path/to/template.html" data-key1="${view.Key1}" data-keyN="${view.KeyN}">
    <span slot="Slot_1"></span>
    <span slot="Slot_2"></span>
</div>

EWA-компоненты поддерживают механизм слотов и пользовательские атрибуты стандартного проекта Web Components, но включение осуществляется без использования пользовательских тегов.

(3) Запрос к интерфейсу

<a data-method="PUT" href="?data=/path/to/put">Поставьте лайк</a>

<h3>Создание таблицы</h3>
<div data-href="?data=/path/to/list?count=10&page=1">
    <ul data-name="list">
        <li>Внутренний индекс: ${view.__index__}</li>
    </ul>
    Всего ${view.total} элементов
</div>

[Полноценный фронтенд-маршрутизатор]

Используя поддержку HTML 5 History API для "чистых Hash URL", движок EWA непосредственно размещает URL страницы SPA после #! (Hash Bang, правило маршрутизации, предложенное Google), что позволяет пользователям использовать F5 или Ctrl + C/V, даже если нет поддержки с серверной стороны.

(0) Запросы-перехватчики

(new EWA()).on({
    type:    'request',
    src:     'api.test.com'
},  function (iEvent, iAJAX) {

    //  Утилиты, расширенные на основе iQuery, для обработки объекта опций jQuery AJAX

    iAJAX.option.url = $.extendURL(iAJAX.option.url, {
        token:    self.sessionStorage.token
    });
});

(1) Обработка ответа

(new EWA()).on({
    type:    'template',
    href:    /\.md$/i
},  function (iEvent, iData) {

    //  Преобразование Markdown в HTML

    return  marked(iData);

}).on({
    type:    'data',
    src:     'api.test.com'
},  function (iEvent, iData) {    if (iData.code || (iEvent.method != 'GET'))
        self.alert(iData.message);
    else
        return iData.data;
});

(2) Завершение загрузки

(new EWA()).on({
    type:    'ready',
    href:    'path/to/template.html'
},  function (iEvent) {

    //  Готовность компонента/страницы

    //  То есть, UI-рендеринг завершен, за исключением мультимедийных ресурсов, таких как img, iframe, audio, video и т.д.
});

(3) Утилиты

  • Получение исходного URL маршрута: WebApp.prototype.getRoute()

    • Чтобы предотвратить неправильную обработку некоторых URL-анализаторов, маршрут EWA кодируется в Base64
  • Изменение начальных данных маршрута: WebApp.prototype.setURLData(key, value)

    • При вызове можно передать только один объект данных

    • Каждый вызов создает новую запись в истории браузера

  • Навигация по истории страниц: WebApp.prototype.loadPage(iStep)

    • Без параметров обновляет текущую страницу

    • При передаче параметров, их использование аналогично window.history.go()

    • После переключения страницы она перезагружается, и решается промис, возвращаемый этим методом

[Асинхронные компоненты]

(0) HTML-шаблоны

Компонент EWA сам по себе является полностью легальным фрагментом HTML, который может быть непосредственно загружен с помощью AJAX и экземплирован в дереве DOM ——```HTML

<style disabled> /* The built-in standard attribute disabled is used to prevent the influence on the global CSS when initializing the DOM subtree, * the VM object is initialized and automatically generates a CSS scope */ </style> <script src="component.js"></script>
Сейчас время: ${(new Date()).toLocaleString()}
```### (1) JavaScript-модули

Как сам EWA-движок, так и код JavaScript для EWA-компонентов следует стандарту AMD, и его необходимый формат следующий:

require([
    'jquery', 'Module_1', 'Module_N', 'EasyWebApp'
],  function ($, Module_1, Module_N, EWA) {

    // Получение единого экземпляра инициализированного WebApp

    var iWebApp = new EWA();

    EWA.component(function (iData) {

        // iData — это JSON, загруженный параллельно с HTML-компонентом

        // Здесь this — это автоматически созданный объект VM

        var VM = this;

        iData.handler_1 = function () {

            // Обратные вызовы также могут быть частью данных и привязаны к HTML с помощью шаблонного синтаксиса

            // Здесь this — это объект VM, соответствующий элементу в структуре HTML

            this.xxx = 'yyy';
        };

        // Если вы изменили ссылку на объект данных, вы должны вернуть новый объект

        iData = $.extend({ }, iData);

        return iData;
    });
});

EWA-движок автоматически обновляет объект VM с помощью возвращенных данных.

(2) Официальные компоненты

https://boot-web.tk/

[Декларативное событие]

Декларативная форма привязки событий: <element onEvent="${view.callback}" />

  • element: имя HTML-тега
  • Event: имя события HTML / EWA
  • callback: ключ функции обратного вызова в объекте данных, при выполнении которой this указывает на объект VM, соответствующий элементу в структуре HTML### Встроенные события | Имя события | Источник | Способ прослушивания | Причина триггера | Этап триггера | Данные обратного вызова | |:-----------:|:--------:|:--------------------:|:-----------------:|:-------------:|:-----------------------:| | request | InnerLink | JS, HTML | AJAX запрос | До | Опции jQuery AJAX, объект jqXHR | | template | HTMLView | JS, HTML | Шаблон компонента | После | Код структуры компонента (например, HTML, Markdown) | | data | InnerLink | JS, HTML | Загрузка данных | После | Объект JSON | | ready | View | JS, HTML | Рендер компонента | После | Объект представления | | route | WebApp | JS | Переключение маршрута | После | Сборка элементов сопоставленных ссылок (объект jQuery) | | prefetch | WebApp | JS | Рендер компонента | После | Массив URL ссылок, на которые ссылается текущий компонент | | attach | View | JS | Монтирование компонента | После | | | detach | View | JS | Отмонтирование компонента | После | | | update | View | JS, HTML | Обновление пользовательских свойств | После | Объект пар ключ-значение обновлений |

Интерфейс событий- Множественные условия для наблюдателей Observer($_Box)

  • Поиск экземпляра: .instanceOf(iDOM, Check_Parent)

  • Регистрация обратного вызова: .prototype.on(iEvent, iCallback)

    • Функция обратного вызова this указывает на объект, на котором был зарегистрирован вызов
    • Первый параметр функции обратного вызова — объект события, второй параметр — дополнительные данные, с которыми событие было вызвано
    • Возвращаемое значение текущей функции обратного вызова будет передано как второй параметр следующей функции обратного вызова
  • Отмена регистрации обратного вызова: .prototype.off(iEvent, iCallback)

  • Одноразовое слушание: .prototype.one(iEvent, iCallback)

    • Если отсутствует обратный вызов, возвращается объект Promise
  • Вызов события: .prototype.emit(iEvent, iData)

  • Реализованные классы: View, InnerLink, WebApp

Параметр iEvent может быть только строкой с именем события или объектом, описывающим более сложные условия (свойства объекта могут быть строками, регулярными выражениями, объектами DOM и т.д.).

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Декларативный веб-движок MVVM, построенный на HTML 5, CSS 3, ECMAScript 5, стандарте AMD, jQuery API. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/Tech_Query-EasyWebApp.git
git@api.gitlife.ru:oschina-mirror/Tech_Query-EasyWebApp.git
oschina-mirror
Tech_Query-EasyWebApp
Tech_Query-EasyWebApp
MVVM