将变量传递给子组件,并获取NaN返回

时间:2011-04-29 19:41:11

标签: flex3 components children nan parents

我在转发器中调用了一个组件。在调用中,我将几个变量传递给组件。所有这些都工作得很好,除了一个名为totalSpan ...由于某种原因返回NaN。这是我正在使用的代码:

父:

<mx:Repeater id="indPositions" dataProvider="{projectPositions}" startingIndex="0" count="{projectPositions.length}">
        <components:block height="28"
            id="thisBlock" visible="true" horizontalScrollPolicy="off"
            width="{projectWidth}"
            oneDay="{Number(oneDay)}"
            offSet="{indPositions.currentItem[0]}"
            numDays="{indPositions.currentItem[1]}"
            position="{indPositions.currentItem[2]}"
            sName="{indPositions.currentItem[3]}"
            projectName="{projectTitle}"
            totalSpan="{Number(Math.round(projectWidth.vl / oneDay))}"
        />
    </mx:Repeater>

其中的所有变量都可以正常工作,并且typeof()就可以了。

这是子代码:

[Bindable] public var totalSpan:Number;

然后在init()函数中我执行一个简单的:

Alert.show(String(totalSpan));

警报返回“NaN”。

在半相关的说明中,我在父母的以下几行收到警告:

offSet="{indPositions.currentItem[0]}"
numDays="{indPositions.currentItem[1]}"
position="{indPositions.currentItem[2]}"
sName="{indPositions.currentItem[3]}"

显示一条消息“数据绑定在使用方括号运算符时无法检测到机会。对于Array,请改用ArrayCollection.getItemAt()。

有人可以对这些警告错误有所了解吗?一个例子将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先,totalSpan的分配如下:

totalSpan="{Number(Math.round(projectWidth.vl / oneDay))}"

但是从width="{projectWidth}"我们可以看到projectWidthNumberint。所以它没有vl属性。而您的Number(Math.round(projectWidth.vl / oneDay))NaN。请正确地重写它。也许它应该是以下内容:

totalSpan="{Number(Math.round(projectWidth / oneDay))}"

关于第二部分。如果您在MXML中使用{},它代表数据绑定。数据绑定通过源的更改提供目标属性的更改。消息说Array是一种基本类型,而mxmlc编译器无法生成代码来处理数组值的变化。

但是从代码中可以明显看出数据结构存在一些问题。很难改进它没有整个项目的代码,但你应该使用自定义数据类型,其中必需的[Bindable]元数据用于数据绑定,而ArrayCollection代替Array用于数据数据绑定源。

尝试创建类似:

的内容
[Bindable]
class MyDataObject
{
    public var offSet:int;
    public var numDays:int;
    public var position:int;
    public var sName:String;
}

并将这些项目放入转发器的数据提供者。据我所知,您的数据提供程序是针对转发器长度的,但在现实生活中它应该提供转发器元素数据。因此,如果您将ArrayCollection个自定义MyDataObject对象传入转发器,则可以使用以下内容:

<mx:Repeater id="indPositions" dataProvider="{projectPositions}">
        <components:block height="28"
            id="thisBlock" visible="true" horizontalScrollPolicy="off"
            width="{projectWidth}"
            oneDay="{Number(oneDay)}"
            offSet="{indPositions.currentItem.offSet}"
            numDays="{indPositions.currentItem.numDays}"
            position="{indPositions.currentItem.position}"
            sName="{indPositions.currentItem.sName}"
            projectName="{projectTitle}"
            totalSpan="{Number(Math.round(projectWidth / oneDay))}"
        />
</mx:Repeater>

甚至更多。您可以将MyDataObject类型的整个对象传递到components:block组件:

<mx:Repeater id="indPositions" dataProvider="{projectPositions}">
        <components:block height="28"
            id="thisBlock" visible="true" horizontalScrollPolicy="off"
            width="{projectWidth}"
            oneDay="{Number(oneDay)}"
            myData="{MyDataObject(currentItem)}"
            projectName="{projectTitle}"
            totalSpan="{Number(Math.round(projectWidth / oneDay))}"
        />
</mx:Repeater>

希望这些想法有所帮助!