Сервисы
Сервисы для клиентского приложения расположены в директории public/js/app/services/
.
Клиентское приложение имеет разные виды сервисов:
- Ввод даты в поле формы,
Datepicker.class.js
- Валидация данных в форме,
FormValidation.class.js
- Подсветка кода,
Highlight.class.js
- Форматирование ввода,
MaskInput.class.js
Добавление сервисов на клиенте
Существует три переменных, с помощью которых происходит добавление сервисов на клиенте:
- Список классов сервисов
window.BSA.ScriptResources
= ['FormValidation', 'Datepicker', ...] - объект параметров сервисов
window.BSA.ScriptParams
= {FormValidation:[{params-1},{params-2}, ...], ...} - объект экземпляров сервисов
window.BSA.ScriptInstances
= {FormValidation:[Obj1, Obj2, ...], ...}
Эти переменные задаются в файле app/Views/Include/add.resources.html.twig
.
<!-- Add script resources -->
<script type="text/javascript">
if ( undefined === window.BSA) {
window.BSA = {};
// List script resources
window.BSA.ScriptResources = [];
// List script parameters
window.BSA.ScriptParams = {};
// List object instances
window.BSA.ScriptInstances = {};
...
}
</script>
Код добавление классов сервисов и их параметров можно посмотреть ниже:
Файл app/Views/Controller/blog/new.html.twig
.
<!-- Add Resources (required) -->
...
<script type="text/javascript">
BSA.ScriptResources.push('FormValidation');
addScriptParams('FormValidation',
{
form: 'form[name="post"]',
rules: {
"post[created]": {
required: true
},
"post[title]": {
required: true,
minlength: 5
},
"post[body]": {
required: true
}
}
});
...
</script>
Функция addScriptParams
определена в файле app/Views/Include/add.resources.html.twig
.
Для создания экземпляра объекта сервиса и сохранения его в переменной
window.BSA.ScriptInstances
используется классовый метод RegRunOnLoad,
который определен в классах сервисов. Выполняются эти методы в функции init
класса App public/js/app/app.js
.
Пример кода приведен ниже:
...
// Add script resources
if (undefined !== window.BSA) {
_.each(BSA.ScriptResources, function (resource) {
require([resource], function (res) {
// Create resource object
if (res && res.RegRunOnLoad) {
res.RegRunOnLoad();
}
});
});
}
...
С помощью функции require
загружается сам сервис и все его зависимости,
которые определены в файле public/js/main.js
.
Обратиться к экземпляру объекта сервиса можно например так:
var oFormValidation1 = BSA.ScriptInstances['FormValidation'][0];
oFormValidation1.Validate();
Структура сервисов
Классы сервисов как и другие классы создаются с помощью
Class.extend public/js/lib/Extend.class.js
.
Более подробно можно посмотреть здесь
Основные способы использования:
Class.extend(props)
Class.extend(props, staticProps)
Class.extend([mixins], props)
Class.extend([mixins], props, staticProps)
Например структура сервиса public/js/app/services/Highlight.class
выглядит так:
define(['jquery'], function ($) {
var Highlight = Class.extend({
init: function (params) {
try {
...
} catch (ex) {
if (ex instanceof Error) {
app.sys.onFailure(ex.name + ": " + ex.message);
}
}
}
}, {
RegRunOnLoad: function () {
...
}
});
return Highlight;
});
Здесь init
есть функция инициализации создаваемого объекта, а RegRunOnLoad
есть классовая (статическая) функция создания экземпляра объекта и
помещение его в переменную BSA.ScriptInstances
BSA.ScriptInstances['Highlight'] = [new Highlight(param)];