【问题标题】:Flex DropdownList CreationComplete errorFlex DropdownList CreationComplete 错误
【发布时间】:2010-09-08 16:01:03
【问题描述】:

我有一个显示提供者列表的下拉列表,并且必须选择与该患者关联的提供者。

下拉列表:

<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 第一次为空。但是当回击并再次进入同一页面时,一切正常,并且列表中的 1 个提供者被正确选择。

可能我认为第一次,在填充 List 之前调用了 creationComplete 处理程序方法。第二次调用时,列表被填充并且处理程序工作正常。如果有人能在这方面帮助我解决这个问题,那就太好了。

谢谢

哈里什

【问题讨论】:

    标签: apache-flex drop-down-menu


    【解决方案1】:

    很难说这里发生了什么,但问题就在这里:

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

    该行中有很多地方可能会发生空指针异常。

    很可能 - 在位置 count 返回的 practiceProvider 没有设置提供程序。我们看不到这个值是如何填充的,但考虑到这个代码稍后会起作用,我会说你遇到了一个竞争条件 - 数据在设置之前就被访问了。

    至少,您应该为此添加一个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
    }  
    

    考虑到弹性服务器调用的异步性质,竞争条件有点棘手。 (我假设您正在从远程服务器加载数据)。

    有两种方法可以解决这个问题 -

    • 将此方法的执行推迟到数据加载完成 - 您可以通过将 eventListener 添加到 RemoteService 的 ResultEvent 来做到这一点

    • 第一次不用担心,只要数据发生变化就重新执行该方法。

    例如:

    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();
     }
    

    【讨论】:

    • 感谢 Marty 的回复,它消除了错误。但是第一次没有选择供应商。下次会这样。所以仍然没有解决我的问题:(有没有办法解决竞争条件。抱歉,我是 Flex 世界的新手!
    • 马蒂,谢谢。我想我发现了导致错误的原因。 providerObj 不可绑定。所以我添加了这个,瞧!我会将您的答案标记为正确:)。非常感谢!!!
    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2012-03-19
    • 2012-06-13
    • 2011-04-27
    • 2023-03-11
    相关资源
    最近更新 更多