【问题标题】:Flex 3: refreshing repeater after adding a childFlex 3:添加孩子后刷新中继器
【发布时间】:2011-05-23 17:24:04
【问题描述】:

在一个孩子中,我有一个具有以下结构的 XML 元素:

<position>
    <startOffset>*NUMBER*</startOffset>
    <numDays>*NUMBER*</numDays>
    <role>*String*</role>
    <student>*String*</student>
    <conflict>*BOOLEAN*</conflict>
</position>

然后我使用中继器将每个列表列出到屏幕上。我创建了一个用于创建职位的按钮。所以,一旦用户点击了这个按钮,我就会调用下面的函数:

private function addPosition(index:Number):void
{
    var tempObject:XML = XML("<position><startOffset>0</startOffset><numDays>3</numDays><role>1C</role><student> </student><conflict>false</conflict></position>");             
    projectPositions.appendChild(tempObject);
    projectHeight += 35;
    parentApplication.checkOverlap();           
}

上述函数创建了一个新的 XML 对象,将一些默认值放入其中,并将其附加到项目位置列表中。附加新信​​息后,我将项目的高度调大,然后检查以确保新项目高度没有与任何其他项目重叠......但该信息与这篇文章无关。

我的问题是——一旦我将一个新的子元素附加到 XML 变量中,它就不会出现在屏幕上。我可以对中继器执行“刷新”或“重新渲染”选项以使新子显示吗?

编辑 - 附加信息

这是变量声明(信息来自父级):

[Bindable] public var projectPositions:XML;

这是中继器(实际上是在呼叫另一个孩子):

<mx:Repeater id="indPositions" dataProvider="{projectPositions.children()}" startingIndex="0">
    <components:block height="38" alpha=".75" 
        id="thisBlock" visible="true" horizontalScrollPolicy="off"
        width="{projectWidth}"
        oneDay="{Number(oneDay)}"
        position="{indPositions.currentItem.role}"
        offSet="{indPositions.currentItem.startOffset}"
        numDays="{indPositions.currentItem.numDays}"
        sName="{indPositions.currentItem.student}"
        isConflict="{indPositions.currentItem.conflict}"
        projectName="{projectTitle}"
        totalSpan="{returnSpan()}"
        projectsHttp="{projectsHttp}"
        allStudents="{allStudents}"
        thisBlockID="{indPositions.currentIndex}"
    />
</mx:Repeater>

然后,一旦用户点击“添加位置”按钮,就会调用以下函数:

private function addPosition(index:Number):void
{
    var tempObject:XML = XML("<position><startOffset>0</startOffset><numDays>3</numDays><role>" + possiblePositions[index] + "</role><student> </student><conflict>false</conflict></position>");
    positionsList.addItem(tempObject);
    projectHeight += 35;
    parentApplication.checkOverlap();
}

这就是我首先尝试做的事情(当我发表这篇文章时)......然后我在你的回复后改变了一些东西并最终得到了这个:

声明:

[Bindable] public var projectPositions:XML;
[Bindable] public var projectXMLList:XMLList = XMLList(projectPositions);
[Bindable] public var projectPositionsXLC:XMLListCollection = XMLListCollection(projectXMLList);

中继器:

<mx:Repeater id="indPositions" dataProvider="{projectPositionsXLC}" startingIndex="0">

addPosition 函数:

private function addPosition(index:Number):void
{
    var tempObject:XML = XML("<position><startOffset>0</startOffset><numDays>3</numDays><role>" + possiblePositions[index] + "</role><student> </student><conflict>false</conflict></position>");               
    projectPositionsXLC.addItem(tempObject);
    projectHeight += 35;
    parentApplication.checkOverlap();           
}

一旦我进行了更改,并使用 XMLListCollection 作为转发器中的数据提供者,信息将不再加载到屏幕上:(

【问题讨论】:

    标签: xml apache-flex repeater appendchild


    【解决方案1】:

    XMLList 不能成为数据绑定处理列表更改的有效来源。要摆脱正确的数据绑定,请改用XMLListCollection

    【讨论】:

    • 我用作数据提供者的变量声明如下:[Bindable] public var projectPositions:XML;在我的中继器本身中,我的 dataprovider 定义如下: dataProvider="{projectPositions.children()}"
    • 对。它是XMLList。尝试改用XMLListCollection。并在那里添加新值。
    • 我尝试将我目前拥有的 XML 变量转换为 xmllistcollection,然后使用它,最终得到相同的结果...我可以通过警报看到该项目已添加,但它没有向用户显示。
    • 好的,能多加点代码吗(变量声明、中继部分、加值部分)?
    • 我添加了更多代码......它在第一篇文章的“编辑 - 附加信息”部分下方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2023-03-20
    • 2022-10-04
    • 2017-02-07
    • 2015-01-07
    • 2013-08-11
    相关资源
    最近更新 更多