PDA

Просмотр полной версии : AS3 DataProvider Как получить значение Элемента, внутри объекта


LighFusion
28.03.2015, 22:50
Доброго Времени суток, долго меня терзает данный вопрос - не как не могу решить.
Каким способом можно получить значение - элемента внутри массива объекта, мне это нужно для правильного вывода нужного мне объекта, ибо способ dataProvider.getItemAt(0).address, не подходит - поскольку объекты индексируются 1 за другим, по мере длины коллекции, то есть нужный мне объект имеет Index 100, а ID его 20,
и указав в getItemAt(20), я получу совсем другой объект(А не тот который мне нужен), как мне обратиться напрямую к значению элемента(ID) внутри Объекта.

Объекты в моем случае это маркеры xml.
<marker id="1" name="Egypt Column test" scale="3" address="myMD2Models/packs/modelpack1/testHouse/testHouseMD2.md2" image="myMD2Models/packs/modelpack1/testHouse/testHouse.png" type="MD2" descript="a 3D model" zip="myMD2Models/packs/modelpack1/Model1.zip" />

В массив они добавляются подобным образом
for (var i:uint=0; i < markersCount; i++) {
var markerXml:XML = markers[i];

acMarkers.addItem({label: markerXml.@name, scale: markerXml.@scale, address: markerXml.@address,image: markerXml.@image, type: markerXml.@type, descript:markerXml.@descript,zip:markerXml.@zip });
}
<mx:DataGrid id="myDataGrid" dataProvider="{this.acMarkers}" itemClick="showInfo(event)" height="423.65" y="61" x="10" width="162.55" alternatingItemColors="[#F7F7F7, #EFE4E4]" sortableColumns="false">


Не могу понять как мне проиндексировать объекты используя значение маркера ID, нужно вывести в отдельную переменную значение маркера ID, а потом использовать эту переменную в getItemAt(index("20")),или нужно создавать свой аналог getItemAt, addItem, а так же GetItemID(чтобы возвращать значение ID)?

По сути я хочу иметь возможность указывать значение ID, для того объекта который хочу вызвать, для загрузки.
Надеюсь все нормально объяснил!
Буду очень рад если помогут, мучаюсь уже пару дней.
Полный сурс проекта что я использую
http://pastebin.com/nfuC1Hzy

Wolsh
28.03.2015, 23:56
Массив можно отсортировать по id
markers.sortOn("@id");но это Вам поможет только если в id есть настоящий порядок, то есть имеется весь ряд чисел по-порядку.

Wolsh
29.03.2015, 00:09
Товарищ создает массив (markers) XML-ек и затем в цикле запихивает в DataProvider (acMarkers) итемы на основе этих XML-ек.
И затем хочет выковыривать итемы из DataProvider по их индексу, который бы совпадал с id.

LighFusion
29.03.2015, 00:26
Массив можно отсортировать по id
markers.sortOn("@id");но это Вам поможет только если в id есть настоящий порядок, то есть имеется весь ряд чисел по-порядку.
А как будет выглядеть сам метод - который будет вызывать нужный мне объект(по значению его атрибута/маркера), то есть можно использовать все как есть - dataProvider.getItemAt(index"100").address, getItem указывает на нужный мне объект через значение его атрибута, то есть этот метод будет пролистовывать по всем объектам и их атрибутам, и выводить мне только тот объект, с атрибутом которого я указал. Или нужно создавать свой метод ?


И скажем так, возможно ли использовать совсем другой поставшик данных, не dataProvider, цель лишь 1 - загрузить в сцену модель из списка .xml, по определенному ID, по сути это своего рода ModelViewer на Flash, типа такого http://goo.gl/C9vFk0.

Заранее спасибо, очень приятно что ответили так быстро!

P.S.
Товарищ создает массив (markers) XML-ек и затем в цикле запихивает в DataProvider (acMarkers) итемы на основе этих XML-ек.
И затем хочет выковыривать итемы из DataProvider по их индексу, который бы совпадал с id.
но ведь индекс добавляется к каждому объекту по порядку, как сделать значение индекса равным значению ID самого итема, то есть не по порядку - Object(a)index(1),Object(b)index(2),Object(c)index(3); А Object(a)Index=Ojbect(a).Id, Object(b)Index=Ojbect(b).Id и тд , ведь сам id храниться в XML-Файле для каждого объекта свой.

Wolsh
29.03.2015, 16:56
1/ как сделать значение индекса равным значению ID самого итемаaddItemAt(id)
2/
Пользователь выбрал итем из списка — посылается Событие? В нем есть индекс итема или ссылка на него? Как-то же Вы узнаете, что пользователь сделал выбор? По этому индексу или ссылке можно достучаться до ID?

А то Ваш вопрос зыучит в какой-то обратной логике — типа "у меня есть ID но я не знаю как найти элемент в ДатаПровайдере по этому ID, чтобы... УЗНАТЬ ЕГО ID".
Если ID известен, то что мешает найти в XML нужную ноду и взять адрес?
Если индекс известен, то что мешает найти объект в ДатаПровайдере по этому индексу и взять адрес?

LighFusion
29.03.2015, 20:13
1/ addItemAt(id)
2/
Пользователь выбрал итем из списка — посылается Событие? В нем есть индекс итема или ссылка на него? Как-то же Вы узнаете, что пользователь сделал выбор? По этому индексу или ссылке можно достучаться до ID?

А то Ваш вопрос зыучит в какой-то обратной логике — типа "у меня есть ID но я не знаю как найти элемент в ДатаПровайдере по этому ID, чтобы... УЗНАТЬ ЕГО ID".
Если ID известен, то что мешает найти в XML нужную ноду и взять адрес?
Если индекс известен, то что мешает найти объект в ДатаПровайдере по этому индексу и взять адрес?

addItemAt(id) К сожалению игнорирует Значение Index'a большее чем количество объектов, внутри DataProvider, то есть к примеру объектов в нем 2, а я ставлю acMarkers.addItemAt({address: markerXml.@address},20); 20 естественно превышает длину DataProvider, и игнорируется, так что не очень понимаю как это пофиксить ?Вообще это помоему не правильный способ(для того что мне нужно), ибо он используется для уже существующих объектов, а не для присвоение индекса к входящим.

Пользователю заранее предоставляется страница с той вещью которую он хочет просмотреть в 3D, при нажатии на кнопку, заранее заготовленный JS, передает вписанное значение - подобным образом
<a href="javascript:aionModelViewer.openWindow(600,525,4,110900069,'ru_RU');"><img src="/img/aion/viewin3d_ru_RU.png" border="0"></a>
110900069 это ID самой модели, которая должна отобразиться в сцене по средствам ActionScript, достаточно просто обратиться с ID, к файлу .xml где прописан путь до модели с этим ID, но вся проблема происходит до этого, нужно же ведь обратиться к объекту - указывая требуемый ID, ведь только после этого можно вписать какой параметр требуется использовать(в моем случае это путь до модели), а когда указываешь 110900069, а объект с нужным адресом, проиндексировался по-порядку и имеет Index(100), то не получаешь того что хотел.
Напрямую к адрессу/пути(до модели) не обратиться.
Объекты же ведь идут подобным образом
<?xml version="1.0" encoding="UTF-8"?>
<markers>
Первый Объект
<marker id="1" name="Egypt Column test" scale="3" address="myMD2Models/packs/modelpack1/testHouse/testHouseMD2.md2" image="myMD2Models/packs/modelpack1/testHouse/testHouse.png" type="MD2" descript="a 3D model" zip="myMD2Models/packs/modelpack1/Model1.zip" />
Второй Объект
<marker id="20" name="Egypt Column quake" scale="3" address="myMD2Models/packs/modelpack1/testHouse/theQuakeHouse.md2" image="myMD2Models/packs/modelpack1/testHouse/testImageQuakeSolid.png" type="MD2" descript="a 3D model" zip="myMD2Models/packs/modelpack1/Model1.zip" />
</markers>

GBee
29.03.2015, 21:04
а запрос не поможет xml.marker.(@id==110900069)?

Добавлено через 5 минут
Или можно сделать словарь:

var acMarkersDict:Object ={};
for (var i:uint=0; i < markersCount; i++)
{
var markerXml:XML = markers[i];
var id:uint = uint(markerXml.@id);
var obj:Object = {id: id, label: markerXml.@name, scale: markerXml.@scale, address: markerXml.@address,image: markerXml.@image, type: markerXml.@type, descript:markerXml.@descript,zip:markerXml.@zip };
acMarkersDict[id] = obj;
acMarkers.addItem(obj);
}

LighFusion
29.03.2015, 21:10
а запрос не поможет xml.marker.(@id==110900069)?
НУ в принципе наверное поможет, если обращение идет по всем объектам внутри .xml, и при нахождении нужного оно присваивается, в переменную которую можно использовать как Index.

Вообще я по-моему понял как это решить, но не знаю как это представить в коде.
Суть в том чтоб загрузить все объекты из .xml в массив обычным образом, то есть OBJ1,OBJ2,OBJ3,OBJ4, А дальше прочесть у всех объектов параметр(id), и сделать что-то типа If Equals requestid == id(из объектов), то вернуть index Объекта на котором этот id Был найден, а дальше уже подставить Index в GetobjectAt(index) и все.

Но вроде только я не шарю как это лучше представить в коде ?

GBee
29.03.2015, 21:18
Я не очень понимаю, что вы делаете.
Вы можете описать логику ГУЯ нормально? Просто то что описано я вижу так:
Есть таблица заполненная массивом, который был собран из хмл.
Вам почему-то нужно взять инфу о каком то объекте по ид, но вы лезете в датапровайдер таблицы (хотя там уже даже не ваш массив, а ArrayCollection по идее)
Или вам нужно по выбранному элементу в таблице показать инфу о нем, передав ид во внешний ЖС?

Добавлено через 4 минуты
Но в любом случае словарь решает вашу задачу, по-моему.

LighFusion
29.03.2015, 21:37
Я не очень понимаю, что вы делаете.
Вы можете описать логику ГУЯ нормально? Просто то что описано я вижу так:
Есть таблица заполненная массивом, который был собран из хмл.
Вам почему-то нужно взять инфу о каком то объекте по ид, но вы лезете в датапровайдер таблицы (хотя там уже даже не ваш массив, а ArrayCollection по идее)
Или вам нужно по выбранному элементу в таблице показать инфу о нем, передав ид во внешний ЖС?

Добавлено через 4 минуты
Но в любом случае словарь решает вашу задачу, по-моему.
Нет передавать обратно в ЖС не надо,
жс возвращает в ActionScript - RequestID(через FlashVars), этот RequestID указывает на ID модели которую нужно будет загрузить, через хмл - <marker id="20" adress="mymodels/model.md2" >OBJ1,<marker id="25" adress="mymodels/model2.md2" >OBJ2, на сколько я понял, через словари - можно прочесть значение маркера id, и обратно вернется порядковый номер самого объекта, если будет if statement equals, которое уже потом будет возвращаться в глобал переменную - само значение, которое можно подставить в getItemAt, надеюсь я вас правильно понял ?
P.S.
Или оно сразу использует ID(acMarkersDict[id] = obj;) из xml- как значение порядкового номера ?

Wolsh
29.03.2015, 22:49
Я так и не понял, зачем Вам "порядковый номер самого объекта" или его индекс в провайдере, если у Вас есть XML с маркерами, у которых есть @id и есть адрес (@zip)... Берете эту ноду по рецепту GBee и получаете из нее адрес. Либо я вообще ничего не понимаю(((

LighFusion
30.03.2015, 00:47
Я так и не понял, зачем Вам "порядковый номер самого объекта" или его индекс в провайдере, если у Вас есть XML с маркерами, у которых есть @id и есть адрес (@zip)... Берете эту ноду по рецепту GBee и получаете из нее адрес. Либо я вообще ничего не понимаю(((
А как ее тогда подставить в подобный метод particles_ary[prevIndex].load(myDataGrid.dataProvider.getItemAt(1).address,myCarSkin, 10, 3);
я так понимаю нужно acMarkersDict поместить в GetItemAt, то есть getItemAt(acMarkersDict[2000]).address. -будет выдавать объект xml с значением ноде ID=2000 ?

а дальше примерно так, если requestID был найден в acMarkersDict, вернуть индекс объекта, и поставить в getItemAt().
public get requestId();
{
if(acMarkersDict.value == requestId)
return acMarkersDict.value;
}
Сразу извиняюсь если что-то выглядит слишком глупо, я сам в этом не силен, и это в новинку, но вроде уже решается !

Wolsh
30.03.2015, 00:54
particles_ary[prevIndex].load(xml.marker.(@id==110900069).@zip, myCarSkin, 10, 3);

LighFusion
30.03.2015, 01:37
particles_ary[prevIndex].load(xml.marker.(@id==110900069).@zip, myCarSkin, 10, 3);
Ооо!! спасибо то что надо =D - возвращает нужный мне объект, эх я нуб - использовал DataProvider И прочий бред, хотя я сразу сказал что может эта фигня и не нужна.

Всем еще раз спасибо!