×

消息

EU e-Privacy Directive

This website uses cookies to manage authentication, navigation, and other functions. By using our website, you agree that we can place these types of cookies on your device.

View e-Privacy Directive Documents

You have declined cookies. This decision can be reversed.

Etant un développeur Java, j'ai jamais joué avec un langage qui supporte nativement data-binding. Donc j'ai mon excuse de faire des bêtises au début :-)

Voilà l'histoire. Je fais une classe toute bête:

package model
{
	public class MockRefData
	{
		[Bindable]
		private var _data:String = "titi";
		
		public function get data():String
		{
			return _data;
		}

		public function set data(value:String):void
		{
			_data = value;
		}
	}
}

et un panel pas trop compliqué non-plus:

<s:Application
	xmlns:fx="http://ns.adobe.com/mxml/2009"
	xmlns:s="library://ns.adobe.com/flex/spark"
	xmlns:mx="library://ns.adobe.com/flex/mx"
	initialize="init()">

	<fx:Script>
		<![CDATA[
			import model.MockRefData;
			
			[Bindable]
			public var refData:MockRefData = new MockRefData();
			
			private function init():void {
				refData.data = "toto";
			}
		]]>
	</fx:Script>
	<s:Panel width="100%" height="100%" title="Test app">
		<s:VGroup>
			<s:HGroup verticalAlign="middle">
				<s:Label text="Data:"/>
				<s:TextInput id="data_txt" text="{refData.data}"/>
			</s:HGroup>
		</s:VGroup>
	</s:Panel>
</s:Application>

et puis je suis content et j'ai complètement ignoré le warning en ligne 24: Data binding will not be able to detect assignments to "data" — de toute façon, j'ai pas compris ce qu'il voulait dire...J'attends que mon petit "toto" s'affiche sur l'écran, mais pas de chance, je vois "titi". Ça veut dire que soit ma méthode init() n'est pas exécutée (en debug je vois que c'est pas le cas), soit il y a un gros souci sur mon couplage. Recherche sur google me donne pas grande chose, mais j'ai finalement trouvé la cause tout seul: le warning, il a tout à fait raisons.

En fait j'ai couplé le contenu du champs de texte avec la sortie d'une méthode: le getter de l'attribut "data", mais pas l'attribut lui-même. Du coup, avant l'appel à la méthode init(), comme "data" a été initialisé de la manière statique, il a une valeur "titi" et c'est alimenté au champs de texte. Quand dans init() je change la valeur du "data", Flex n'est pas capable de savoir mon changement et de ré-exécuter le getter. C'est bien un désavantage de mélanger (sur écriture) un getter et une assignation, je crois. Donc à la fin, la solution est de coupler le champs avec un attribut publique, tout proprement comme dans les tutoriaux.

提交评论


安全码
刷新