Не удается получить доступ к дочерним элементам arrayCollection в сетке данных - PullRequest
0 голосов
/ 22 мая 2009

У меня есть приложение Flex 3 с HTTPService, возвращающее фид Atom. Я улавливаю результат и сохраняю его в arrayCollection, который затем является поставщиком моего Datagrid. У меня нет проблем с доступом к данным из «первого уровня» моего массива, но я не могу их использовать. Не очень понятно, вот код:

Мой XML [часть его]:

<entry>
<title>Test 2</title>
<id>http://collaboration.*****.com/collaboration/messaging/feeds/****/todo//7D6637D3E86B3ED3C12575B***8479</id>
<link rel="alternate" href="notes:///C12575B4004***8/0/7D6637D3E86B3ED3C12575B6004E8479" type="application/vnd.lotus-notes"/>
<published>2009-05-14T16:17:37+02:00</published>
<updated>2009-05-14T16:17:56+02:00</updated>
<clb:todo>
<clb:uid>7D66***3ED3C12575B6004E8479</clb:uid>
<clb:due>2009-05-31T12:01:00+02:00</clb:due>
<clb:status>Not Started</clb:status>
</clb:todo>
</entry>

Код моей таблицы данных:

        <mx:AdvancedDataGrid y="10" id="notesGrid" width="90%" height="243" designViewDataType="flat" x="10" selectionMode="multipleRows" dataProvider="{notesArray}" >
            <mx:columns>
                <mx:AdvancedDataGridColumn 
                    headerText="TITRE" 
                    dataField="title" 
                    fontWeight="bold"
                 />
                <mx:AdvancedDataGridColumn headerText="STATUT" dataField="todo.status"/>
            </mx:columns>
        </mx:AdvancedDataGrid>

В столбце «заголовок» данные отображаются правильно, но столбец состояния пуст! Когда я запускаю свое приложение в режиме отладки, я вижу, что мой notesArray имеет правильный формат, и я могу получить доступ к todo -> status со значением ...

Я застрял на этом в течение нескольких дней, я был бы признателен за любую помощь! Спасибо и всего наилучшего !!

Ответы [ 3 ]

0 голосов
/ 22 мая 2009

Я почти уверен, что свойство dataField объекта DataGridColumn / AdvancedDataGridColumn не разрешает автоматически вложенные свойства, т. Е. "Todo.status"; вы можете попробовать написать labelFunction, которая будет обращаться к вложенному элементу XML для вас.

0 голосов
/ 22 мая 2009

Общее правило, которому я следую, когда дело доходит до подобных проблем, - делать что-то вроде этого (просто чтобы убедиться, что вы получаете все, что искали):

import flash.utils.getQualifiedClassName;

// As a general rule, I don't find it the best idea to access an object in 
// an IList (ArrayCollection, XMLListCollection, et al ) by a dynamic property.
// Especially when they are coming from XML, the best way to access everything 
// is through getItemAt.
var len:int = todo.length;
for( var i:int = 0; i < len; i++ )
{
    var item:* = todo.getItemAt( i );
    trace( item, getQualifiedClassName( item ) );
}

После этого моей первой попыткой будет заменить это:

<mx:AdvancedDataGridColumn headerText="STATUT" dataField="todo.status"/>

с этим:

<mx:AdvancedDataGridColumn headerText="STATUT" dataField="{ todo.status }"/>

Очень часто Flex не очень хорошо работает с вложенными свойствами, но когда вы используете скобки, он дает значение, которое находится в этом месте, в качестве более прямой ссылки.

Я думаю, вам лучше использовать XMLListCollection вместо ArrayCollection. Таким образом, вы можете называть детей по имени, а не полагаться на их обычный индекс в IList.

0 голосов
/ 22 мая 2009

Это может быть связано с тем, что узел «status» использует пространство имен «clb», отличное от вашего заголовка. Вам может понадобиться указать пространство имен для доступа к его данным.

Мне пришлось сделать нечто подобное при получении данных XML из .NET WebService. Мне понадобилось несколько дней, чтобы понять это.

Если ваш XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<atomFeed xmlns:clb="CLB.data">
    <entry>
    <title>Test 2</title>
    <id>http://collaboration.*****.com/collaboration/messaging/feeds/****/todo//7D6637D3E86B3ED3C12575B***8479</id>
    <link rel="alternate" href="notes:///C12575B4004***8/0/7D6637D3E86B3ED3C12575B6004E8479" type="application/vnd.lotus-notes"/>
    <published>2009-05-14T16:17:37+02:00</published>
    <updated>2009-05-14T16:17:56+02:00</updated>
    <clb:todo>
    <clb:uid>7D66***3ED3C12575B6004E8479</clb:uid>
    <clb:due>2009-05-31T12:01:00+02:00</clb:due>
    <clb:status>Not Started</clb:status>
    </clb:todo>
    </entry>
</atomFeed>

Добавьте это к ActionScript, где вы обрабатываете результат HTTPService:

private namespace clbNS = "CLB.data";

use namespace clbNS;

Например:

пакет { import mx.rpc.events.ResultEvent;

public class handleAtomFeed
{
    private namespace clbNS = "CLB.data";

    use namespace clbNS;

    private function resultHandler(event:ResultEvent):void
    {
        // pares the XML and build your ArrayCollection
    }
}

}

Дайте ему шанс, это может сработать !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...