Передача переменных в дочерний компонент и получение возвращаемых значений NaN - PullRequest
0 голосов
/ 29 апреля 2011

У меня есть компонент, вызываемый в повторителе. В рамках вызова я передаю несколько переменных компоненту. Все они работают нормально, за исключением одного с именем 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 Ответ

0 голосов
/ 30 апреля 2011

Прежде всего присваивание 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 для данных, используемых в качестве источника привязки данных. 1022 *

Попробуйте создать что-то вроде:

[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>

Надеюсь, эти мысли помогут!

...