Связь между модулем Flex и приложением - PullRequest
0 голосов
/ 21 июля 2011

Хорошо, модули во Flex популярны, но я понятия не имею, почему документация и примеры различных применений модулей Flex могут быть столь скудными.

В любом случае, для этого вопроса я возьму классического сотрудника /Пример отдела.У меня есть main.mxml, который содержит mx: TabNavigator.Каждая вкладка загружается с помощью s: ModuleLoader.

Таблицы: Сотрудники {empID, empName, deptID}, Deparments {deptID, deptName}

Навигатор вкладок содержит только одну вкладку (для нашего примера) называется Сотрудник.У меня есть модуль Employee.mxml.В этом модуле у меня есть сетка данных, которая заполнена данными сотрудника.Я использую функцию getEmployees ($ deptID).Эта функция, как вы можете догадаться, возвращает мне массив сотрудников, которые работают в определенном отделе.

За пределами TabNavigator у меня есть DepartmentDropDownList, который заполняется с именем кафедры.deptName.

Моя цель - загрузить модуль Employee, когда я выбираю конкретный отдел из DropDownList.У меня есть changeHandler для DropDownList, который может дать мне deptID.

protected function departmentDropDownList_changeHandler(event:IndexChangeEvent):void
{
MyDeptID=departmentDropDownList.selectedItem.deptID;
//var ichild:*=employeeModule.child as IModuleInfo;
}

Теперь вопрос на миллион долларов: как передать этот deptID в модуль «Сотрудники».У последнего есть employee_creationCompleteHandler, который вызывает getEmployees (deptID):

protected function EmployeesDg_creationCompleteHandler(event:FlexEvent):void
// I only need to get the deptID from the departmentDropDownList outside the Employee module.
// If I could create a global variable deptID, that would be great!
 getEmployeessResult.token=employeeService.getEmployeess(deptID);
}

Я пытался использовать переменные [Bindable], но безуспешно.

Буду признателен за ваши предложения.

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Вы не можете гарантировать, что deptID будет установлен при запуске creationComplete - похоже, вы ожидаете результата на сервере - так что, вероятно, это не лучший способ справиться с этим.

Одна из вещей, о которых вы должны быть осторожны, - это прямая ссылка на полный класс модуля из основного приложения, поскольку суть модулей в том, что вам не следует компилировать класс модуля в основной класс (чтобы уменьшить размер файла / время загрузки).

Итак, вы можете создать интерфейс.Это создает «контракт» между основным приложением и модулем без переноса всего кода реализации с ним.Это могло бы выглядеть примерно такмал, они очень плохая привычкаПрактически невозможно исправить проект, который начинается с них, а затем развивается до такой степени, что никто не может точно определить, какой из сотен или тысяч Классов, имеющих доступ к переменной, неправильно ее изменяет принеправильное время.

Вы ОСОБЕННО не хотите использовать глобальные переменные с модулями, поскольку они могут вызвать действительно серьезные проблемы, когда модули начинают бороться за определение.

1 голос
/ 22 июля 2011

Мы решили эту проблему с помощью Cairngorm v2.Думайте об этом как о шине сообщений для ActionScript, одной из нескольких.В вашем методе DepartmentDropDownList_changeHandler мы создадим событие DeptChanged с идентификатором в качестве полезной нагрузки и отправим его по шине всем подписчикам этого типа сообщений.Это сработало очень хорошо для нас и сделало события более управляемыми, что в некоторых кругах само по себе считается хорошим.

0 голосов
/ 22 июля 2011

@ J_A_X Мне не повезло с использованием Robotlegs из коробки с модулями.Кажется, что-то не так с контекстами безопасности, хотя и не должно.Мне пришлось использовать ModuleContext Джоэла Хукса, чтобы заставить его работать правильно, хотя мои потребности были довольно простыми.

...