FileReference TypeError:错误#1009:无法访问空对象引用的属性或方法

时间:2014-03-18 11:25:05

标签: actionscript-3 flex flex4

在我的表单中,我有一个带有浏览按钮的 TextInput 和一个 FileReference 。在这种形式,当我提交而不选择任何图像文件时,它将抛出类似“TypeError:错误#1009:无法访问空对象引用的属性或方法”的错误。

我的需要: 如果我在没有选择任何图像文件的情况下提交表单,则必须以编程方式拍摄虚拟图像。我对此一无所知。

我的示例代码:

        <s:Form id="mainForm" height="100%" width="100%" left="10%" right="10%" top="10%">
            <s:FormItem id="nameLabel" label="Employee Name">
                <s:TextInput id="employeeName" rollOver="validateAndSubmit()"/>
            </s:FormItem> 
            <s:FormItem id="imageLabel" label="Image">
                <mx:HBox>
                    <s:TextInput id="employeeImageName" editable="false" showErrorSkin="true" showErrorTip="false"/>
                    <s:Button id="imageButton" label="Browse" click="onBrowseButtonClicked(event)"/>
                </mx:HBox >
            </s:FormItem>
            <s:FormItem>
                <s:layout>
                    <s:HorizontalLayout gap="10"/>
                </s:layout>
                <s:Button id="submitButton" label="Submit" click="storeInputs(event)"/>
                <s:Button id="clearButton" label="clear" click="clearInputs()"/>
            </s:FormItem>
        </s:Form>
        <s:DataGrid width="100%" height="100%" dataProvider="{arrayCollection}">
        <s:columns>
            <s:ArrayList>
                <s:GridColumn headerText="Name" dataField="name" />
                <s:GridColumn headerText="Employee" id="imageColumn" dataField="imageData"/>
                <s:itemRenderer>
                    <fx:Component>
                        <s:GridItemRenderer>                                    
                            <s:Image id="image"  source="{data.imageData}"  visible="true" height="80" width="100"/>
                        </s:GridItemRenderer>
                    </fx:Component>
                </s:itemRenderer>
            </s:ArrayList>
        </s:columns>
    </s:DataGrid>

storeInput()

        private function storeInputs(event:MouseEvent) : void
        {
            arrayCollection.addItem({
                name : employeeName.text, 
                imageData: loadFile.data
            });
        }

修改 我的onBrowseButtonClicked()代码:

        public var loadFile:FileReference; 
        [Bindable]private var arrayCollection : ArrayCollection = new ArrayCollection ();

        private function onBrowseButtonClicked(event : MouseEvent) : void
        {
            loadFile = new FileReference();

            loadFile.addEventListener(Event.SELECT, selectHandler);
            var fileFilter:FileFilter = new FileFilter("Images: (*.jpeg, *.jpg, *.gif, *.png)", "*.jpeg; *.jpg; *.gif; *.png");
            loadFile.browse([fileFilter]);
        }

        private function selectHandler(event:Event):void
        {
            loadFile.load();    
        }

如果我没有使用浏览按钮选择任何文件,则必须自动加载虚拟图像。我该怎么办?

2 个答案:

答案 0 :(得分:1)

首先将它的图片标记设为itemRenderer,如下所示

<s:GridColumn headerText="Employee" id="imageColumn" dataField="imageData" itemRenderer="components.GridItemRender"/>

GridItemRender.MXML

    <fx:Script>
    <![CDATA[           
        import mx.events.FlexEvent;         

        protected function emp_renderHandler(event:Event):void
        {
            if (data.imageData == null)
            {
                image.source = "http://localhost/demo/images/male.jpg";
            }
        }

    ]]>
</fx:Script>

<s:Image id="image"  source="{data.imageData}"  width="80" height="100" render="emp_renderHandler(event)"/>

我认为这段代码可以帮助你...

答案 1 :(得分:0)

你需要这样的东西:你可能需要更改错误事件类型,我使用e:IOErrorEvent作为我的URLLoader对象,但我不确定它适用于你的情况

private function selectHandler(event:Event):void
{
   try
   {

      loadFile.load();

   } catch (e:Error)
      {
         loadFile = dummypicture;
         loadFile.load();
      }
}