Передача переменных в дочерний компонент и получение возвратов 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>

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

Другие вопросы по тегам