вівторок, 21 грудня 2010 р.

Реализация Enum на клиентской стороне

Решаемая задача:
Создаёться модуль DNN, реализующий некоторую функциональность. Контрол по умолчанию (Который реализует View Mode), должен обладать также некоторой клиентской логикой (частично - валидация данных формы, частично - управлениями елементами формы - без необходимости обратной отправки формы на сервер).



Решаеться задача путём реализации интерфейса IScriptControl класом контрола модуля.
В соответствующей клиентской части (отдельный java-скрипт файл) возникла необходимость использования перечисления. (Если кратко: в зависимости от выбора в некотором выпадающем списке А, надо активировать/деактивировать контролы на форме. При инициализации контрола, в числе прочего передаеться объект, в котором в качестве ключа выступает допустимые значения из управляющего списка, а значение - это логическое произведение значений из перечисления, соответствующих активным, для даного выбора контролам)

Собственно перечисление определяеться следующим образом:
Netroster.Modules.NR_OpsReportFilters = function() { };
Netroster.Modules.NR_OpsReportFilters .prototype = {
None : 0,
Employer : 1,
Staff : 2,
Client : 4,
ClientSite : 8,
Region : 16,
StartDate : 32,
FinishDate:64,
Verify:128,
RecycleBin:256
};
Netroster.Modules.NR_OpsReportFilters.registerEnum('Netroster.Modules.NR_OpsReportFilters', true);

Первый аргумент - название типа (вместе с пространством имён) - на клиентской стороне. Второй - булево значение, указывающее - являеться ли данное перечисление битовым полем (как показано в примере), или - нет.

Теперь установить некоторую переменную флаг можно с помощью следующего выражения:
var activeCtls = (Netroster.Modules.NR_OpsReportFilters.Employer | Netroster.Modules.NR_OpsReportFilters.RecycleBin | Netroster.Modules.NR_OpsReportFilters.Region);

А проверить, установлено ли значение для Netroster.Modules.NR_OpsReportFilters.Region:
if(activeCtls & Netroster.Modules.NR_OpsReportFilters.Region)
{
alert('Региональный Фильтр активен!');
}


Касательно второго аргумента метода registerEnum(тип, битовое_поле):
Если true:
//в окошке видим 17
alert(Netroster.Modules.NR_OpsReportFilters.Employer | Netroster.Modules.NR_OpsReportFilters.Region);

Если false:
//получаем ArgumentOutOfRangeException - поскольку дизъюнкция наших двух значений из перечисления - неправомерно :-)
alert(Netroster.Modules.NR_OpsReportFilters.Employer | Netroster.Modules.NR_OpsReportFilters.Region);

Немає коментарів:

Дописати коментар