Передача переменных в дочерний компонент и получение возвратов NaN
У меня есть компонент, вызываемый внутри повторителя. В рамках вызова я передаю несколько переменных компоненту. Все они работают нормально, за исключением одного с именем 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().
Кто-нибудь может пролить свет на эти ошибки предупреждения? пример был бы очень признателен.
1 ответ
Прежде всего назначение 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>
Надеюсь, что эти мысли помогут!