0

我有一个在中继器中被调用的组件。在调用中,我将几个变量传递给组件。除了一个名为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]}"

显示“使用方括号运算符时数据绑定将无法检测机会。对于数组,请改用 ArrayCollection.getItemAt()。

任何人都可以阐明这些警告错误吗?一个例子将不胜感激。

4

1 回答 1

0

首先赋值totalSpan如下:

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

但从width="{projectWidth}"我们可以看出projectWidth是一个Numberint。所以它没有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>

希望这些想法有所帮助!

于 2011-04-29T20:08:54.077 回答