PDA

Просмотр полной версии : Помогите опознать причину warning-га.


Macika
13.05.2009, 14:26
При дебаге получаю следующий ворнинг: warning: unable to bind to property 'name' on class 'Object' (class is not an IEventDispatcher).

Собственно программа работает, как и ожидается, но ворнинг меня смущает. В чём может быть его причина?

Участники процесса, я так подозреваю: List, кастомный рендер и дата провайдер.

Вот код:


List

<mx:List width="100%" height="100%" id="lSystemList"
itemRenderer="com.artica.renderers.StorageRenderer"
dataProvider="{systemDataProvider}"/>



Render

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
horizontalAlign="center"
horizontalScrollPolicy="off"
verticalScrollPolicy="off"
paddingTop="4"
paddingBottom="4" width="100%" height="100%">

<mx:HBox width="100%" verticalAlign="middle">
<mx:Image source="/assets/a16.png"/>
<mx:Label text="{data.name}"/>
</mx:HBox>

</mx:VBox>


Манипуляции примерно следующие:

for each (var sNod:XML in xml.system)
{
systemDataProvider.addItem({name:sNod.name});
}


Что я такого ужасного сделал? :wacko:

wvxvw
13.05.2009, 14:42
<mx:Label text="{data.name}"/>
data не может диспатчить события, поэтому и забиндить к ней нельзя.

Macika
13.05.2009, 14:45
Так я и не пытаюсь ничего диспатчить. Или я чего-то не понимаю? Как мне по-другому вытаскивать данные из моего дата провайдера?

wvxvw
13.05.2009, 14:52
Binding это класс, в основе функциональности которого заложено то, что свойство, которое нужно забиндить является свойством объекта, который может диспатчить события. Свойство data является Object и поэтому диспатчить события не может. Если нужно привязаться к этому свойству, добавьте функцию, которая будет это свойство возвращать и привяжитесь к ней:
<mx:Script>
<![CDATA[
private function getData():String
{
return this.data.name;
}
]]>
<mx:Script>
<mx:Label text="{getData()}"/>

Macika
13.05.2009, 15:24
Ворнинг исчез, но вместе с ним и перестали выводиться данные:)
Непонятно.

wvxvw
13.05.2009, 15:31
Ой :) поправил

Macika
13.05.2009, 15:38
Собственно уже пробовал и так.
Пробовал старый вариант + getData().name.

Потрейсил, проблема в том, что сама data всегда null.

wvxvw
13.05.2009, 16:10
А, ну так понятное дело тогда :)
<mx:Script>
<![CDATA[
override public function set data(value:Object):void
{
myLabel.text = value.name;
}
]]>
<mx:Script>
<mx:Label id="myLabel"/>

Macika
13.05.2009, 16:28
Это первый вариант, который я попробовал. Нарыл его в cookbook, но если я так делаю, я не могу ничего выбрать в листе:)

wvxvw
13.05.2009, 16:56
А так:
<mx:Script>
<![CDATA[
private var _labelText:String;
override public function set data(value:Object):void
{
_labelText = value.name;
}
override protected function childrenCreated():void
{
myLabel.text = _labelText;
super.childrenCreated();
}
]]>
<mx:Script>
<mx:Label id="myLabel"/>

GBee
13.05.2009, 17:31
Вампир, прекрати мучать человека :о))

<mx:Script>
<![CDATA[
[Bindable]
private var _myData:Object; //Здесь нужный класс (SomeClass) можно использовать
override public function set data(value:Object):void
{
_myData = value; //as SomeClass
super.data = value;
}
]]>
<mx:Script>
<mx:Label text="{_myData.name}"/>

Macika
13.05.2009, 17:40
Картинки есть, а текста нет :(

GBee
13.05.2009, 17:46
Вампир, вы можете продолжить :о))

поставьте брйкпоинт в сеттер и посмотрите, что вам приходит в value.

wvxvw
13.05.2009, 18:05
<mx:Script>
<![CDATA[
[Bindable]
private var _myData:Object; //Здесь нужный класс (SomeClass) можно использовать
override public function set data(value:Object):void
{
_myData = value; //as SomeClass
trace("Data set for this renderer:", (value is XML ? value.toXMLString() : value));
super.data = value;
}
]]>
<mx:Script>
<mx:Label text="{_myData.name + String(trace('Executing bindings for Label', _myData.name))}"/>

GBee
13.05.2009, 18:15
Дебаггинг для маленьких? :о))

Macika
13.05.2009, 18:54
Вампир, вы можете продолжить :о))

поставьте брйкпоинт в сеттер и посмотрите, что вам приходит в value.

Я очень даже ЗА! Вдруг научусь чему-нибудь:)

Дебаггер сообщает, что приходит XMLList.

Код камрада wvxvw выдаёт следующее:


warning: unable to bind to property 'name' on class 'Object' (class is not an IEventDispatcher)
Executing bindings for Label SystemName_1
Data set for this renderer: [object Object]
Data set for this renderer: [object Object]
warning: unable to bind to property 'name' on class 'Object' (class is not an IEventDispatcher)
Executing bindings for Label SystemName_2
Data set for this renderer: [object Object]
warning: unable to bind to property 'name' on class 'Object' (class is not an IEventDispatcher)
Executing bindings for Label SystemName_3
Data set for this renderer: [object Object]
warning: unable to bind to property 'name' on class 'Object' (class is not an IEventDispatcher)
Executing bindings for Label SystemName_1
Data set for this renderer: [object Object]
warning: unable to bind to property 'name' on class 'Object' (class is not an IEventDispatcher)
Executing bindings for Label SystemName_2
Data set for this renderer: [object Object]
warning: unable to bind to property 'name' on class 'Object' (class is not an IEventDispatcher)
Executing bindings for Label SystemName_3
Data set for this renderer: [object Object]


Таже проблема, только достигнута более сложным путём :wacko: Всмысле всё работает нормально, только ворнинг мозолит глаза.

r_r_f_r
13.05.2009, 19:04
Вообще у флекса есть проблема с варнингами(они могут продолжать отображаться, даже если уже источник варнинга устранён) и закрытие проекта и закрытие самого флекса с последующим открытием соответствующего ситуацию не спасает.

В переписку не вникал, удачи:)

wvxvw
13.05.2009, 20:20
<mx:Script>
<![CDATA[
private var _myData:Object;
private function setData(event:Event):void
{
(event.currentTarget as Label).text = _myData.name;
}
override public function set data(value:Object):void
{
_myData = value;
super.data = value;
}
]]>
<mx:Script>
<mx:Label creationComplete="setData(event)"/>

GBee
13.05.2009, 21:42
биндинг сработать должен был, и так , автор покажите хмл

Macika
14.05.2009, 12:10
<mx:Script>
<![CDATA[
private var _myData:Object;
private function setData(event:Event):void
{
(event.currentTarget as Label).text = _myData.name;
}
override public function set data(value:Object):void
{
_myData = value;
super.data = value;
}
]]>
<mx:Script>
<mx:Label creationComplete="setData(event)"/>

Этот код тоже хорошо работает. Но воринг остался. Наверное действительно какой-то баг флекса.

ХМЛ такой:


<?xml version='1.0' encoding='utf-8'?>
<systems>
<system>
<name>SystemName_1</name>
<id>540123095712</id>
<type>1x2</type>
<address></address>
<hardware></hardware>
<software></software>
</system>
<system>
<name>SystemName_2</name>
<id>481120384221</id>
<type>1x2</type>
<address></address>
<hardware></hardware>
<software></software>
</system>
<system>
<name>SystemName_3</name>
<id>984175722112</id>
<type>1x3</type>
<address></address>
<hardware></hardware>
<software></software>
</system>
</systems>


Ничего сверх естественного :)

GBee
14.05.2009, 12:19
Странно, мой код точно должен был сработать, разве что так попробовать можно
<mx:Script>
<![CDATA[
[Bindable]
private var _myData:Object; //Здесь нужный класс (SomeClass) можно использовать
override public function set data(value:Object):void
{
_myData = value; //as SomeClass
super.data = value;
}
]]>
<mx:Script>
<mx:Label text="{_myData[0].name}"/>

Macika
14.05.2009, 12:52
Data binding will not be able to detect changes when using square bracket operator. For Array, please use ArrayCollection.getItemAt() instead.

Метки не выводятся.

GBee
14.05.2009, 14:23
логично. я ступил
а так ?
<mx:Script>
<![CDATA[
[Bindable]
private var _myData:Object; //Здесь нужный класс (SomeClass) можно использовать
override public function set data(value:Object):void
{
_myData = value[0]; //это же XMLList по-вашему
super.data = value;
}
]]>
<mx:Script>
<mx:Label text="{_myData.name}"/>

Macika
14.05.2009, 15:56
Уже по-моему был такой вариант:) Он работает, но ворнинг остается.

wvxvw
14.05.2009, 18:39
Этот код тоже хорошо работает. Но воринг остался. Наверное действительно какой-то баг флекса.

ХМЛ такой:


<?xml version='1.0' encoding='utf-8'?>
<systems>
<system>
<name>SystemName_1</name>
<id>540123095712</id>
<type>1x2</type>
<address></address>
<hardware></hardware>
<software></software>
</system>
<system>
<name>SystemName_2</name>
<id>481120384221</id>
<type>1x2</type>
<address></address>
<hardware></hardware>
<software></software>
</system>
<system>
<name>SystemName_3</name>
<id>984175722112</id>
<type>1x3</type>
<address></address>
<hardware></hardware>
<software></software>
</system>
</systems>


Ничего сверх естественного :)

Дык в моем коде вообще биндинг не используется... наверное ворнинг просто из другого места...

GBee
14.05.2009, 22:53
Угу, поддерживаю.