Создание Flex DropdownListComplete - PullRequest
       0

Создание Flex DropdownListComplete

2 голосов
/ 08 сентября 2010

У меня есть DropdownList, в котором показан список поставщиков, и необходимо выбрать поставщика, связанного с этим пациентом.

Раскрывающийся список:

<s:DropDownList id="providerList"
        width="80%"
        fontSize="12"
        fontWeight="bold"
        selectionColor="white"
        creationComplete="providerList_creationCompleteHandler(event)"
        dataProvider="{model.practiceProviderList.practiceProviders}"/>

, где PracticeProviders является коллекцией ArrayCollection

Функция CreationCompleteHandler:

protected function providerList_creationCompleteHandler(event:FlexEvent):void
   {
    var firstN:String;
    var lastN:String;
    var providerObj:Provider = new Provider();

    if (model.patientDetails.patientDetail.patientProviders != null && model.patientDetails.patientDetail.patientProviders.length > 0)
    {
     firstN = patientDetailsModel.patientDetails.patientDetail.patientProviders.getItemAt(0).provider.providerName.firstName;
     lastN = patientDetailsModel.patientDetails.patientDetail.patientProviders.getItemAt(0).provider.providerName.lastName; 

for (var count:int = 0; count < patientDetailsModel.practiceProviderList.practiceProviders.length; ++count)
     {
 providerObj = patientDetailsModel.practiceProviderList.practiceProviders.getItemAt(count, 0).provider as Provider;

if (providerObj.providerName.firstName == firstN && providerObj.providerName.lastName == lastN)
      {
 this.providerList.selectedIndex = count;
      }
     }
    }
   }

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

TypeError: Error #1009: Cannot access a property or method of a null object reference.
 at com.newwavetechnologies.modules::demographics/providerList_creationCompleteHandler()[C:\harish\flex\apps\workspace\dataCollection-flexUserInterface\src\com\newwavetechnologies\modules\demographics.mxml:166]
 at com.newwavetechnologies.modules::demographics/__providerList_creationComplete()[C:\harish\flex\apps\workspace\dataCollection-flexUserInterface\src\com\newwavetechnologies\modules\demographics.mxml:359]
 at flash.events::EventDispatcher/dispatchEventFunction()
 at flash.events::EventDispatcher/dispatchEvent()
 at mx.core::UIComponent/dispatchEvent()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\core\UIComponent.as:12266]
 at mx.core::UIComponent/set initialized()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\core\UIComponent.as:1577]
 at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:759]
 at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1072]

где строка 166:

if (providerObj.providerName.firstName == firstN && providerObj.providerName.lastName == lastN)

providerObj нулевой в первый раз. Но при ответном ударе и повторном посещении той же страницы все работает нормально, и один из поставщиков в списке выбран правильно.

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

Спасибо

Хариш

1 Ответ

3 голосов
/ 08 сентября 2010

Трудно сказать, что здесь происходит, но проблема заключается здесь:

providerObj = patientDetailsModel.practiceProviderList.practiceProviders.getItemAt(count, 0).provider as Provider;

В этой строке содержится масса мест, в которых могут возникать исключения нулевого указателя.

Скорее всего - practiceProvider, возвращенный в позиции count, не имеет установленного провайдера. Мы не можем видеть, как это значение заполняется, но, учитывая, что этот код работает позже, я бы сказал, что у вас происходит состояние гонки - к данным обращаются до того, как они установлены.

По крайней мере, вы должны добавить guardClause для этого:

var practiceProviders:ArrayCollection = patientDetailsModel.practiceProviderList.practiceProviders;
for (var count:int = 0; count < practiceProviders.length; ++count)
{
      providerObj = practiceProviders.getItemAt(count, 0).provider as Provider;
      if (!providerObj)
         continue;
      // etc
}  

Состояние гонки немного сложнее, учитывая асинхронный характер вызовов Flex-сервера. (Я предполагаю, что вы загружаете данные с удаленного сервера).

Есть два подхода для решения этой проблемы - либо

  • отложить выполнение этого метода до загрузки данных - вы можете сделать это, добавив eventListener к ResultEvent RemoteService

или

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

например:

protected function providerList_creationCompleteHandler(event:FlexEvent):void
{
     dataProvider.addEventListener(CollectionEvent.COLLECTION_CHANGE,onCollectionChange,false,0,true);
    updateProviders();
    // Rest of existing creationComplete code moved to updateProviders();
 }
 private function updateProviders()
 {
       // Code from existing creationComplete handler goes here
 }
 private function onCollectionChange(event:CollectionEvent):void
 {
      updateProviders();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...