Flex CheckBox问题

时间:2009-09-17 19:00:55

标签: flex checkbox

<mx:DataGrid x="10" y="10" width="180" height="302" id="dgActions" dataProvider="{actionCollection}">
   <mx:columns>
      <mx:DataGridColumn headerText="Action" dataField="name"/>
         <mx:DataGridColumn headerText="" dataField="setting"  width="30" rendererIsEditor="true"> 
         <mx:itemRenderer >
            <mx:Component>
               <mx:Box width="100%" height="100%" horizontalAlign="center" verticalAlign="middle">
                  <mx:CheckBox selected="{data.setting}" click="setActionSetting()">
                     <mx:Script>
                       <![CDATA[
                        private function setActionSetting(){
                           data.setting = String(this.selected);
                        }
                        ]]>
                     </mx:Script>
                  </mx:CheckBox>
               </mx:Box>
            </mx:Component>
         </mx:itemRenderer>
      </mx:DataGridColumn>
   </mx:columns>
</mx:DataGrid>

出于某种原因,我在data.setting = String(this.selected)行中收到错误,该行显示“通过带静态类型的引用访问可能的未定义属性”。

[编辑]上述问题的解决方案(尽管不是整个混乱)是,一旦你进入<mx:Component>标签,你就属于所述组件的范围。要访问此组件外部的脚本和节点,必须使用 outerDocument 对象。 [结束编辑]

我不确定它的期望是什么,我假设它会将复选框的选定(ness)的true / false值传递给方法,但似乎不明白“this”是什么,在这种情况下。

我做错了什么吗?我想要的只是让数据源反映最初输入复选框的状态的变化。

编辑: 我刚刚注意到,当我向函数添加trace('foo')时,它永远不会将任何内容写回控制台。复选框的本机行为(和事件捕获)是否阻止它冒泡到我的函数?

此外,当我在文档的其余部分添加对象外部的引用时,它告诉我它不能识别它们。我对Flex范围内的事情感到困惑......任何额外的指导或参考链接都非常方便。

4 个答案:

答案 0 :(得分:1)

此(ha)情况下的指的是组件渲染器,而不是周围的类(或复选框,datagridcolumn,datagrid等)。最好不要将渲染器分解为实际组件,这样就不会像使用内联组件方法那样模糊范围。

Peter Ent's series on itemRenderers非常有用,应该解释您想要了解的有关该主题的所有信息。

答案 1 :(得分:0)

如果我不得不猜测“this”是mx:Script元素,请尝试“parent.selected”。

答案 2 :(得分:0)

CheckBox.selected需要Boolean值。您将data.setting设置为String值的事实告诉我data.setting不是Boolean

答案 3 :(得分:0)

所以,经过大量的痛苦之后,我终于想出了这一切是如何运作的......

乔尔走在正确的轨道上,这个没有提到你希望它会引用的东西(即复选框)。此外,即使您将 this 传递给方法FROM复选框节点,它也会引用父包装类而不是复选框本身。因此,解决方案是传入事件,然后访问其目标,最后是复选框。然后你就回家了。

换句话说......

<mx:CheckBox  selected="{data.setting}" click="setActionSetting(event)">
    <mx:Script>
        <![CDATA[
            private function setActionSetting(e:Event):void{
                data.setting = e.target.selected;
                trace("n=" + data.name + " set to " + data.setting);
                //the name is the other piece of the data that I omitted for clarity
            }
        ]]>
    </mx:Script>
</mx:CheckBox>