我在转发器中调用了一个组件。在调用中,我将几个变量传递给组件。所有这些都工作得很好,除了一个名为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()。
有人可以对这些警告错误有所了解吗?一个例子将不胜感激。
答案 0 :(得分:0)
首先,totalSpan
的分配如下:
totalSpan="{Number(Math.round(projectWidth.vl / oneDay))}"
但是从width="{projectWidth}"
我们可以看到projectWidth
是Number
或int
。所以它没有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>
希望这些想法有所帮助!