<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Блог Diestro</title>
	
	<link>http://blog.diestro.ru</link>
	<description>Flex, Flash, ActionScript</description>
	<lastBuildDate>Wed, 06 Jul 2011 05:23:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/diestro" /><feedburner:info uri="diestro" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Биндинг в ActionScript проектах. Часть 3</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/TzSWbUL1h8w/</link>
		<comments>http://blog.diestro.ru/binding-v-actionscript-3/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 05:52:41 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[binding]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=379</guid>
		<description><![CDATA[В предыдущих статьях мы рассмотрели возможности биндинга в плане привязки метатега [Bindable] к различным элементам нашего кода и кастомизации срабатывания биндинга с помощью событий. На этом возможности биндинга не ограничиваются. Подписка на события биндинга в методах BindingUtlis.bindProperty и BindingUtlis.bindSetter также дает большое количество возможностей для его реализации. Для того чтобы слушать изменения свойства или метода, [...]]]></description>
			<content:encoded><![CDATA[<p>В предыдущих статьях мы рассмотрели возможности биндинга в плане привязки метатега <code class="codecolorer text mac-classic"><span class="text">[Bindable]</span></code> к различным элементам нашего кода и кастомизации срабатывания биндинга с помощью событий. На этом возможности биндинга не ограничиваются. Подписка на события биндинга в методах <code class="codecolorer text mac-classic"><span class="text">BindingUtlis.bindProperty</span></code> и <code class="codecolorer text mac-classic"><span class="text">BindingUtlis.bindSetter</span></code> также дает большое количество возможностей для его реализации.<span id="more-379"></span></p>
<p>Для того чтобы слушать изменения свойства или метода, помеченного как <code class="codecolorer text mac-classic"><span class="text">[Bindable]</span></code>, необходимо использовать один из методов  <code class="codecolorer text mac-classic"><span class="text">BindingUtlis.bindProperty</span></code> или <code class="codecolorer text mac-classic"><span class="text">BindingUtlis.bindSetter</span></code>.</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> bindProperty <span style="color: #66cc66;">&#40;</span>site:<span style="color: #0066CC;">Object</span>, prop:<span style="color: #0066CC;">String</span>, host:<span style="color: #0066CC;">Object</span>, chain:<span style="color: #0066CC;">Object</span>, commitOnly:<span style="color: #0066CC;">Boolean</span> = <span style="color: #000000; font-weight: bold;">false</span>, useWeakReference:<span style="color: #0066CC;">Boolean</span> = <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>:ChangeWatcher<br />
<span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> bindSetter &nbsp; <span style="color: #66cc66;">&#40;</span>setter:<span style="color: #000000; font-weight: bold;">Function</span>, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;host:<span style="color: #0066CC;">Object</span>, chain:<span style="color: #0066CC;">Object</span>, commitOnly:<span style="color: #0066CC;">Boolean</span> = <span style="color: #000000; font-weight: bold;">false</span>, useWeakReference:<span style="color: #0066CC;">Boolean</span> = <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>:ChangeWatcher</div></div>
<p>Единственное принципиальное отличие этих двух методов заключается в том что в первом случае в результате срабатывания биндинга меняется значение указанного свойства <code class="codecolorer text mac-classic"><span class="text">prop</span></code> в объекте <code class="codecolorer text mac-classic"><span class="text">site</span></code>, во втором вызывается метод <code class="codecolorer text mac-classic"><span class="text">setter</span></code> для обработки результата. В остальном эти два метода принимают одинаковые параметры и дальнейшее повествование будет иметь одинаковый смысл для обоих случаев.</p>
<h2>Параметр host</h2>
<p>Параметр <code class="codecolorer text mac-classic"><span class="text">host</span></code> это объект в котором находится параметр или цепочка параметров за которыми необходимо следить.</p>
<h2>Параметр chain</h2>
<p>Итак, и метод <code class="codecolorer text mac-classic"><span class="text">bindProperty</span></code> и <code class="codecolorer text mac-classic"><span class="text">bindSetter</span></code> имеют обязательный параметр <code class="codecolorer text mac-classic"><span class="text">сhain</span></code> типа <code class="codecolorer text mac-classic"><span class="text">Object</span></code>, который может принимать следующие значения:</p>
<h3>chain в виде строки</h3>
<p>Определяет имя привязываемого свойства:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span>onPropChange, host, <span style="color: #ff0000;">&quot;prop&quot;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>До сих пор мы в качестве <code class="codecolorer text mac-classic"><span class="text">chain</span></code> всегда передавали именно строку и об использовании данного параметра в таком качестве можно прочесть в предыдущих статьях;</p>
<h3>chain в виде массива</h3>
<p> Непустой массив, содержащий последовательность свойств за которыми необходимо следить:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BindingUtils.<span style="color: #006600;">bindProperty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, <span style="color: #ff0000;">&quot;prop&quot;</span>, host, <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;a&quot;</span>, <span style="color: #ff0000;">&quot;b&quot;</span>, <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Массив в качестве цепочки крайне удобен и используется достаточно часто. Цепочка свойств должна быть указана в виде <code class="codecolorer text mac-classic"><span class="text">[&quot;a&quot;,&quot;b&quot;,&quot;c&quot;]</span></code> что будет соответствовать привязке свойства <code class="codecolorer text mac-classic"><span class="text">host.a.b.c</span></code>. Может возникнуть вполне резонный вопрос: &#8220;Почему в качестве <code class="codecolorer text mac-classic"><span class="text">host</span></code> не указать сразу <code class="codecolorer text mac-classic"><span class="text">host.a.b</span></code>, а свойство за которым следить не передать в качестве строки <code class="codecolorer text mac-classic"><span class="text">&quot;c&quot;</span></code>?</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BindingUtils.<span style="color: #006600;">bindProperty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, <span style="color: #ff0000;">&quot;prop&quot;</span>, host.<span style="color: #006600;">a</span>.<span style="color: #006600;">b</span>, <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Цепочкой целесообразно пользоваться когда в ней встречаются изменяющиеся свойства тоже помеченные метатегом <code class="codecolorer text mac-classic"><span class="text">[Bindable]</span></code>. Утилиты биндинга автоматически будут распознавать изменение любого из таких свойств в цепочке и нам не понадобится городить биндинг в биндинге, следить чтобы экземпляры <code class="codecolorer text mac-classic"><span class="text">ChangeWatcher</span></code> были отписаны и т.п.</p>
<p>Представим что у нас есть класс <code class="codecolorer text mac-classic"><span class="text">Model</span></code> в котором есть свойство <code class="codecolorer text mac-classic"><span class="text">item</span></code> типа <code class="codecolorer text mac-classic"><span class="text">Item</span></code>:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<span style="color: #66cc66;">&#123;</span><br />
<br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">EventDispatcher</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Model <span style="color: #0066CC;">extends</span> EventDispatcher<span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> item:Item;<br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Model<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>Класс <code class="codecolorer text mac-classic"><span class="text">Item</span></code> в свою очередь содержит свойство <code class="codecolorer text mac-classic"><span class="text">color</span></code></p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<span style="color: #66cc66;">&#123;</span><br />
<br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">EventDispatcher</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Item <span style="color: #0066CC;">extends</span> EventDispatcher<span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">color</span>:uint;<br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Item<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>Так же есть класс отображения <code class="codecolorer text mac-classic"><span class="text">CurrentColorView</span></code> который должен показывать текущий цвет для текущего элемнта <code class="codecolorer text mac-classic"><span class="text">item</span></code> в классе <code class="codecolorer text mac-classic"><span class="text">Model</span></code>.</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<span style="color: #66cc66;">&#123;</span><br />
<br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">binding</span>.<span style="color: #006600;">utils</span>.<span style="color: #006600;">BindingUtils</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CurrentColorView <span style="color: #0066CC;">extends</span> Sprite<span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> model:Model;<br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> CurrentColorView<span style="color: #66cc66;">&#40;</span>model:Model<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">this</span>.<span style="color: #006600;">model</span> = model;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span>onColorChange, model, <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;item&quot;</span>, <span style="color: #ff0000;">&quot;color&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onColorChange<span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">int</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// меняем отображение цвета</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #0066CC;">clear</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #0066CC;">beginFill</span><span style="color: #66cc66;">&#40;</span>value<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #006600;">drawCircle</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #0066CC;">endFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В данном примере свойство за которым нужно следить задается как раз в виде цепочки. При смене экземпляра в свойстве <code class="codecolorer text mac-classic"><span class="text">item</span></code> класса <code class="codecolorer text mac-classic"><span class="text">Model</span></code> биндинг сработает автоматически и метод <code class="codecolorer text mac-classic"><span class="text">onColorChange</span></code> получит значение цвета уже для нового элемента. То же самое произойдет и при изменении свойства <code class="codecolorer text mac-classic"><span class="text">color</span></code> в экземпляре класса, содержащемся в <code class="codecolorer text mac-classic"><span class="text">item</span></code> класса <code class="codecolorer text mac-classic"><span class="text">Model</span></code>.</p>
<p>Если бы не было возможности задавать отслеживаемые свойства в виде цепочек код пришлось бы усложнить, например написать следующим образом:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">// Внимание! Говнокод!</span><br />
package<span style="color: #66cc66;">&#123;</span><br />
<br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">binding</span>.<span style="color: #006600;">utils</span>.<span style="color: #006600;">BindingUtils</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">binding</span>.<span style="color: #006600;">utils</span>.<span style="color: #006600;">ChangeWatcher</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CurrentColorView <span style="color: #0066CC;">extends</span> Sprite<span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> model:Model;<br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// хранилище для &quot;наблюдателя&quot; за свойтсвом color</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> colorChangeWatcher:ChangeWatcher;<br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> CurrentColorView<span style="color: #66cc66;">&#40;</span>model:Model<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">this</span>.<span style="color: #006600;">model</span> = model;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// подписываемся на изменения свойства item в model</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span>onItemChange, model, <span style="color: #ff0000;">&quot;item&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// обработчик вызываемый при изменении свойства item в классе Model</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onItemChange<span style="color: #66cc66;">&#40;</span>value:Item<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// если мы уже наблюбаем за свойством color отписываемся от наблюдения</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>colorChangeWatcher<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; colorChangeWatcher.<span style="color: #0066CC;">unwatch</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// подписываемся на изменения свойства color в новом экземпляре свойства item класса Model</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; colorChangeWatcher = BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span>onColorChange, value, <span style="color: #ff0000;">&quot;color&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Цвет изменился</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onColorChange<span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">int</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// меняем отображение цвета</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #0066CC;">clear</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #0066CC;">beginFill</span><span style="color: #66cc66;">&#40;</span>value<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #006600;">drawCircle</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #0066CC;">endFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>При увеличении уровня вложенности код будет усложняеться еще сильней, поэтому использование цепочек в качестве параметра для <code class="codecolorer text mac-classic"><span class="text">chain</span></code> очень сильно упрощает жизнь и делает код более лаконичным и понятным.</p>
<h3>chain в виде объекта {name: имя свойства, getter: имя метода}</h3>
<p>В случае когда для параметра <code class="codecolorer text mac-classic"><span class="text">chain</span></code> мы передаем объект в виде <code class="codecolorer text mac-classic"><span class="text">{name: имя свойства, getter: имя метода}</span></code> мы можем подписаться на прослушивание изменения свойства <code class="codecolorer text mac-classic"><span class="text">name</span></code> указаного в виде строки для объекта <code class="codecolorer text mac-classic"><span class="text">host</span></code>. В результате срабатывания биндинга будет вызван метод указанный в свойстве <code class="codecolorer text mac-classic"><span class="text">getter</span></code> который в качестве параметра получит объект <code class="codecolorer text mac-classic"><span class="text">host</span></code>. Этот метод должен возвращать значение, совпадающее по типу со свойством указанным в качестве приемника в случае <code class="codecolorer text mac-classic"><span class="text">bindProperty</span></code>, либо совпадающее по типу с параметром, поступающим в метод обработчика в случае с <code class="codecolorer text mac-classic"><span class="text">bindSetter</span></code>. Т.е. мы можем передать нашему слушателю (свойству или методу) не то значение которое получено, а новое вычисленное значение или объект другого типа после нужного нам преобразования. </p>
<p>Приведу пару примеров:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<br />
<span style="color: #66cc66;">&#123;</span><br />
<br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">binding</span>.<span style="color: #006600;">utils</span>.<span style="color: #006600;">BindingUtils</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Viewer <span style="color: #0066CC;">extends</span> Sprite<br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> viewObject:Sprite = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> keyWord:<span style="color: #0066CC;">String</span> = <span style="color: #ff0000;">&quot;&quot;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Viewer<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; BindingUtils.<span style="color: #006600;">bindProperty</span><span style="color: #66cc66;">&#40;</span>viewObject, <span style="color: #ff0000;">&quot;visible&quot;</span>, <span style="color: #0066CC;">this</span>, <span style="color: #66cc66;">&#123;</span><span style="color: #0066CC;">name</span>:<span style="color: #ff0000;">&quot;keyWord&quot;</span>, getter: <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>host:<span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Boolean</span><span style="color: #66cc66;">&#123;</span><span style="color: #b1b100;">return</span> host.<span style="color: #006600;">keyWord</span> == <span style="color: #ff0000;">&quot;showIt!&quot;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В данном примере у нас есть спрайт <code class="codecolorer text mac-classic"><span class="text">viewObject</span></code>, параметр <code class="codecolorer text mac-classic"><span class="text">visible</span></code> которого будет выставлен в <code class="codecolorer text mac-classic"><span class="text">true</span></code> только в случае когда свойство <code class="codecolorer text mac-classic"><span class="text">keyWord</span></code> примет значение <code class="codecolorer text mac-classic"><span class="text">&quot;showIt!&quot;</span></code>. Т.е. при изменении свойства <code class="codecolorer text mac-classic"><span class="text">keyWord</span></code> вызовется анонимный метод, указанный в поле <code class="codecolorer text mac-classic"><span class="text">getter:</span></code>, возвращающий булево значение. Это значение будет <code class="codecolorer text mac-classic"><span class="text">true</span></code> только в случае совпадения со строкой <code class="codecolorer text mac-classic"><span class="text">&quot;showIt!&quot;</span></code>. Возвращенное значение будет присвоено параметру <code class="codecolorer text mac-classic"><span class="text">visible</span></code> для <code class="codecolorer text mac-classic"><span class="text">viewObject</span></code>.</p>
<p>Рассмотрим пример в случае использования bindSetter:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">binding</span>.<span style="color: #006600;">utils</span>.<span style="color: #006600;">BindingUtils</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> KeyWordLogger <span style="color: #0066CC;">extends</span> Sprite<br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> viewObject:Sprite = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> keyWord:<span style="color: #0066CC;">String</span> = <span style="color: #ff0000;">&quot;first keyword&quot;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> KeyWordLogger<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">log</span>, <span style="color: #0066CC;">this</span>, <span style="color: #66cc66;">&#123;</span><span style="color: #0066CC;">name</span>:<span style="color: #ff0000;">&quot;keyWord&quot;</span>, getter: <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>host:<span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#123;</span><span style="color: #b1b100;">return</span> <span style="color: #ff0000;">&quot;New keyword is: &quot;</span> + host.<span style="color: #006600;">keyWord</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; keyWord = <span style="color: #ff0000;">&quot;second keyword&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; keyWord = <span style="color: #ff0000;">&quot;wrong keyword&quot;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">log</span><span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>value<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В результате выполнения данного кода в консоли мы увидим следующее:</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">New keyword is: first keyword<br />
New keyword is: second keyword<br />
New keyword is: wrong keyword</div></div>
<p>Суть такая же как в и в предыдущем примере только результат возвращенный анонимной функцией будет присвоен не свойству, а передан в качестве параметра методу log, который выводит в консоль получееную строку.</p>
<p>На самом деле приведенной выше конструкцией <code class="codecolorer text mac-classic"><span class="text">chain</span></code> в виде объекта <code class="codecolorer text mac-classic"><span class="text">{name: имя свойства, getter: имя метода}</span></code> я никогда не пользовался, и честно говоря не могу придумать задач для которых это бы было единственным и правильным решением. Я не сторонник написания анонимных функций и считаю что их присутствие в коде влияет на его читабельность и прозрачность не в лучшую сторону, а всю логику, которую можно описать задавая анонимную функцию в качестве <code class="codecolorer text mac-classic"><span class="text">getter</span></code>, можно вынести в метод обработки для <code class="codecolorer text mac-classic"><span class="text">bindSetter</span></code> и сделать все там. Как показал беглый поиск по Flex фреймворку в SDK 3-их и 4-х версий его разработчики тоже не используют данный тип конструкции.</p>
<p>Если кто-то готов показать примеры когда использование анонимного getter дает какие-то преимущества по сравнению с другими способами биндинга готов выслушать и дополнить ими статью.</p>
<h2>Параметр commitOnly</h2>
<p>Использование данного параметра позволяет разделить изменения свойства за которым нужно следить на &#8220;текущее изменение&#8221; и &#8220;окончательное (фиксирующее) изменение&#8221;. Например пользователь в какой то форме с несколькими текстовыми полями делает изменения. Нам необходимо следить за изменениями текстовых полей и нужно знать окончательное это изменение в текстовом поле или пользователь продолжает туда вводить информацию, в зависимости от этого осуществлять валидацию введённой информации.</p>
<p>Если данный параметр выставлен в <code class="codecolorer text mac-classic"><span class="text">true</span></code>, то это означает что мы подписываемся на прослушивания только окончательных изменений в наблюдаемом свойстве. Если же в качестве параметра будет передано <code class="codecolorer text mac-classic"><span class="text">false</span></code> то слушать будем все изменения.</p>
<p>Для указания события для текущих (нефиксирующих) изменений существует метатег <code class="codecolorer text mac-classic"><span class="text">[NonCommittingChangeEvent(event=&quot;&lt;имя события&gt;&quot;)]</span></code>.  Выставлять <code class="codecolorer text mac-classic"><span class="text">commitOnly</span></code> в <code class="codecolorer text mac-classic"><span class="text">true</span></code> имеет смысл только когда перед наблюдаемым свойством присутствует этот метатег. Если <code class="codecolorer text mac-classic"><span class="text">commitOnly</span></code> выставлен в <code class="codecolorer text mac-classic"><span class="text">true</span></code>, то для событий указанных в данном метатеге биндинг срабатывать не будет. Таким образом указывая метатеги <code class="codecolorer text mac-classic"><span class="text">[NonCommittingChangeEvent(event=&quot;&lt;имя события&gt;&quot;)]</span></code> и <code class="codecolorer text mac-classic"><span class="text">[Bindable(event=&quot;&lt;имя события&gt;&quot;)]</span></code> в различных сочетаниях перед наблюдаемым свойством мы можем разделять срабатывание биндинга для фиксирующих и текущих изменений.</p>
<p>Приведу пример исользования данного флага. Допустим нам необходим компонент <code class="codecolorer text mac-classic"><span class="text">TextInputField</span></code> со свойством <code class="codecolorer text mac-classic"><span class="text">inputText</span></code> к которому можно привязать биндинг. Биндинг должен срабатывать при любом изменении текста в компоненте, фиксирующий биндинг должен сработать при потере компонентом фокуса.</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<br />
<span style="color: #66cc66;">&#123;</span><br />
<br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #0066CC;">TextField</span>;<br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #006600;">TextFieldType</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TextInputField <span style="color: #0066CC;">extends</span> <span style="color: #0066CC;">TextField</span><br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> TextInputField<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">type</span> = TextFieldType.<span style="color: #006600;">INPUT</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">border</span> = <span style="color: #000000; font-weight: bold;">true</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Измение текста в текстовом поле</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>NonCommittingChangeEvent<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;change&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Потеря фокуса тестовым полем</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;focusOut&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> inputText<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0066CC;">super</span>.<span style="color: #0066CC;">text</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>Здесь для геттера <code class="codecolorer text mac-classic"><span class="text">inputText</span></code> указано два события для срабатывания биндинга: изменение текста и потеря фокуса. В данном случае нам даже не придется генерировать эти события, их генерирует сам класс <code class="codecolorer text mac-classic"><span class="text">TextField</span></code> от которого мы отнаследовались.</p>
<p>Теперь рассмотрим пример использования класса <code class="codecolorer text mac-classic"><span class="text">TextInputField</span></code></p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;<br />
<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">binding</span>.<span style="color: #006600;">utils</span>.<span style="color: #006600;">BindingUtils</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Form <span style="color: #0066CC;">extends</span> Sprite<br />
<span style="color: #66cc66;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> inputField:TextInputField = <span style="color: #000000; font-weight: bold;">new</span> TextInputField<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Form <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; inputField.<span style="color: #0066CC;">width</span> = <span style="color: #cc66cc;">200</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; inputField.<span style="color: #0066CC;">multiline</span> = <span style="color: #000000; font-weight: bold;">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; inputField.<span style="color: #0066CC;">wordWrap</span> = <span style="color: #000000; font-weight: bold;">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; addChild<span style="color: #66cc66;">&#40;</span>inputField<span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// биндимся на все изменения свойства inputText </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span>onInputChange, inputField, <span style="color: #ff0000;">&quot;inputText&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// биндимся только на фиксацирующие изменения свойства inputText </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span>onInputCommit, inputField, <span style="color: #ff0000;">&quot;inputText&quot;</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onInputChange<span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Текущее изменение: &quot;</span> + value<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onInputCommit<span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Фиксирующее изменение: &quot;</span> + value<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В данном примере мы биндимся два раза на свойство <code class="codecolorer text mac-classic"><span class="text">inputText</span></code>, первый раз для слежения за всеми изменениями этого свойства, второй раз для отслеживания только фиксирующих изменений. В первом случае для обработки будет вызван метод <code class="codecolorer text mac-classic"><span class="text">onInputChange</span></code>, во втором <code class="codecolorer text mac-classic"><span class="text">onInputCommit</span></code>.</p>
<h2>Параметр useWeakReference</h2>
<p>Данный параметр имеет тот же смысл что и в случае подписки на события посредством <code class="codecolorer text mac-classic"><span class="text">addEventListener</span></code>. Он определяет является ли ссылка сильной (<code class="codecolorer text mac-classic"><span class="text">false</span></code>) или слабой (<code class="codecolorer text mac-classic"><span class="text">true</span></code>). По умолчанию ссылка является сильной. В случае слабой ссылки использование биндинга не будет влиять на удаление сборщиком мусора объекта указнного в <code class="codecolorer text mac-classic"><span class="text">host</span></code> из памяти.</p>
<p>На этом позвольте откланяться, это все что я хотел рассказать о биндинге в ActionScript проектах.</p>
<p>p.s. Огромное спасибо друзьям и коллегам из родного <a href="http://www.drimmi.ru">Drimmi</a> за помощь в обсуждении и написании этих постов.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/TzSWbUL1h8w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/binding-v-actionscript-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/binding-v-actionscript-3/</feedburner:origLink></item>
		<item>
		<title>Биндинг в ActionScript проектах. Часть 2</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/YBd57JQuRJE/</link>
		<comments>http://blog.diestro.ru/binding-v-actionscript-2/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 17:21:44 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[binding]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=320</guid>
		<description><![CDATA[Рамки использования метатега [Bindable] значительно шире указнных в статье Биндинг в ActionScript проектах. Часть 1. В данной статье расскажу о том куда можно применить данный метатег и о возможностях биндинга в случае использования собственных событий. Куда можно воткнуть метатег [Bindable]? Метатег [Bindable] можно использовать в следующих местах: 1. Перед свойством. Свойство может быть как public, [...]]]></description>
			<content:encoded><![CDATA[<p>Рамки использования метатега [Bindable] значительно шире указнных в статье <a rel="bookmark" href="../binding-v-actionscript-1/">Биндинг в ActionScript проектах. Часть 1</a>. В данной статье расскажу о том куда можно применить данный метатег и о возможностях биндинга в случае использования собственных событий.<br />
<span id="more-320"></span></p>
<h2>Куда можно воткнуть метатег [Bindable]?</h2>
<p>Метатег [Bindable] можно использовать в следующих местах:</p>
<h3>1. Перед свойством.</h3>
<p>Свойство может быть как public, так и protected или private.</p>
<p>Например:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">text</span>:<span style="color: #0066CC;">String</span>;</div></td></tr></tbody></table></div>
<p>О биндинге применительно к свойствам уже <a href="../binding-v-actionscript-1/">говорилось в первой части</a>. Компилятор автоматически преобразует свойство, помеченное тегом [Bindable] к геттеру/сеттеру с отсылкой события.</p>
<h3>2. Перед определением класса</h3>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SomeClass <span style="color: #0066CC;">extends</span> EventDispatcher</div></td></tr></tbody></table></div>
<p>Это равносильно тому, что мы бы проставили метатег [Bindable] для каждого из public свойств этого класса. Private и protected или свойства из другого пространства имен автоматически не будут помечены как [Bindable]. Если нужно забиндить не public свойства к ним нужно дописывать метатег [Bindable] самостоятельно.</p>
<p>Я бы не рекомендовал использовать эту возможность в ваших проектах, проставьте метатег биндинга вручную там где это нужно. Лучше держать все под контролем и видеть те свойства для которых будет срабатывать биндинг.</p>
<h3>3. Перед get или set методом</h3>
<p>Метатег [Bindable] так же можно использовать если свойства у класса оформленны в виде get/set методов:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _text:<span style="color: #0066CC;">String</span>;<br />
<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> _text;<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; _text = value;<br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>Компилятор позволит вам поставить его как возле геттера, так и возле сеттера. Но! Как изветсно если мы для свойства напишем только сеттер то оно будет доступно только для записи (write only), если же напишем только геттер то только для чтения (read only). С помощью BindingUtils &#8220;забиндиться&#8221; на свойство доступное только для записи невозможно, но сделать это для свойства, доступного только для чтения &#8211; вполне.  Я настоятельно рекомендую всегда писать тег [Bindable] только рядом с геттером, это позволит видеть событие (<a href="#events">см. ниже</a>) и избежать путаницы и ошибок.</p>
<p>Если указан только геттер и свойство доступно только для чтения, целесообразно использовать биндинг только совместно с событиями (<a href="#events">см. раздел &#8220;Кастомные события&#8221;</a>), иначе биндинг сработает только во время инициализации, а среда разработки будет выдавать предупреждения.</p>
<h3>4. Перед методом</h3>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;bindFunctionChange&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> bindFunction<span style="color: #66cc66;">&#40;</span>prop:<span style="color: #0066CC;">int</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> someString;<br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>Так же как и в случае со свойством доступным только для чтения, метатег для метода имеет смысл указывать только вместе с событием. <a href="#functionSample">Ниже</a> можно посмотреть пример использования.<br />
<a name="events"></a></p>
<h2>Кастомные события</h2>
<p>Кастомные события можно использовать для геттеров и методов. <em><strong>К моему великому недоумению кастомные события для биндинга в привязке к свойствам не работают, хотя в официальной документации сказано что их использование вполне возможно.</strong></em></p>
<p>Итак о событиях. <strong>Рассмотрим их при использовании с геттером.</strong> Представим что нам необходимо задать в каких конкретно случаях будет срабатывать биндинг, или чтобы он сработал после того как мы выполним все необходимые оперции в сеттере. Для этого в нашем метатеге мы можем указать событие в результате которого сработает биндинг:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;textChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span></div></td></tr></tbody></table></div>
<p>Для того чтобы биндинг сработал и все слушатели, подписавшиеся посредством BindingUtils, получили уведомление об изменении свойства, в классе со свойством помеченным этим метатегом нужно послать событие:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;textChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Пример:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _text:<span style="color: #0066CC;">String</span>;<br />
<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;textChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> _text;<br />
<span style="color: #66cc66;">&#125;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>value == _text<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>value == <span style="color: #ff0000;">&quot;дурак&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Сам дурак!&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; _text = value;<br />
&nbsp; &nbsp; dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;textChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В данном примере как только изменится свойство text (именно изменится) в консоль при необходимости выведется соответствующее сообщение и посредством отсылки события слушатели будут удовемлены об ее изменении.</p>
<p>Как только мы указали свое событие для биндинга он перестает стандартно срабатывать при изменении свойства для которого указан метатег. Биндинг сработает только в случае когда будет сгенерировано указннное в метатеге событие.</p>
<p>Очень важный нюанс при использовании биндинга с самостоятельным указанием имени события &#8211; это то, что очень желательно проверять старое и новое значение. В случае если оно не изменилось &#8211; слушателей, посредством отсылки событий, уведомлять не нужно. Когда событие в метатеге не указывается, код проверяющий старое и новое значение генерируется автоматически (<a rel="bookmark" href="../binding-v-actionscript-1/#how">см. Часть 1, код в разделе &#8220;Как это работает&#8221;</a>) и биндинг без изменения значения свойства срабатывать не будет.</p>
<p>Итак, при использовании своих событий следите за тем чтобы биндинг лишний раз не срабатывал.</p>
<p>Естественно событие можно послать не только из сеттера, а из любого места в классе. Это может быть полезно, например, при использовании массивов в качестве свойств. Если будет указано:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> items:<span style="color: #0066CC;">Array</span>;</div></td></tr></tbody></table></div>
<p>биндинг сработает только в случае</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">items = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Если просто добавлять элементы в массив</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">items.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Item<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>биндинг не сработает, так как сам экземпляр класса Array в свойстве items остается неизменным. В этом случае мы можем указать метатегу событие</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;itemsChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> items:<span style="color: #0066CC;">Array</span>;</div></td></tr></tbody></table></div>
<p>и отсылать событие</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;itemsChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>при изменении набора элементов в массиве. Тогда элемент отображения, подписавшийся посредством BindingUtils на свойство items, будет получать уведомления не только при изменении экземпляра в свойстве items, но и в тех случаях когда меняется элементы в массиве.<br />
<a name="functionSample"></a><br />
<strong>Рассмотрим биндинг для методов.</strong> Биндинг для методов целесообразен только вкупе с кастомным событием. Он может быть очень полезен и удобен в случаях когда нам не просто нужно получить значение свойства, на которое мы забиндились, а получить некоторое значение в зависимости от некоторых параметров, которые мы можем передать на вход методу. Например, для изменения локализации приложения &#8220;на лету&#8221;.</p>
<p>Пусть у нас есть класс LocaleManager который при смене локали должен оповестить всех заинтересованных слушателей о том что локаль изменилась и дать возможность взять новое значение нужной строки для текущей локали currentLocale. Все строки у нас хранятся в некотором хранилище localeRepository из которого мы можем взять нужную нам строку по ID в соответствии с текущей локалью.</p>
<p>В классе LocaleManager мы заводим метод:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;localeChange&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getLocaleString<span style="color: #66cc66;">&#40;</span>stringID:<span style="color: #0066CC;">int</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> localeRepository.<span style="color: #006600;">getString</span><span style="color: #66cc66;">&#40;</span>currentLocale, stringID<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>При изменении локали нужно сгенерировать событие</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;localeChange&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Все слушатели заинтересованные в получении актуальных значений строк для текущей локали должны подписаться на изменения getLocaleString посредством BindingUtils.</p>
<p>Например у нас есть класс, отображающий некоторые текстовые поля myTextField1 и myTextField2, значение которых должно меняться в зависимости от выбранного языка.</p>
<p>Подписываемся на изменения локали в localeManager:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span>onLocaleChange, localeManager, <span style="color: #ff0000;">&quot;getLocaleString&quot;</span><span style="color: #66cc66;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>В случае смены локали будет вызван метод onLocaleChange, параметром к которому будет передан экземпляр класса Function. Далее мы можем вызвать полученный экземпляр, указывая ему на вход необходимый ID нужной строки.</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onLocaleChange<span style="color: #66cc66;">&#40;</span>func:<span style="color: #000000; font-weight: bold;">Function</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; myTextField1.<span style="color: #0066CC;">text</span> = func.<span style="color: #0066CC;">call</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, <span style="color: #cc66cc;">111</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; myTextField2.<span style="color: #0066CC;">text</span> = func.<span style="color: #0066CC;">call</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, <span style="color: #cc66cc;">222</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В результате при смене локали автоматически поменяется текст в нужных полях элементов отображения.</p>
<p>При использовании кастомных событий возможно указание нескольких метатегов [Bindable (event="")] перед изменяемым обектом:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;xChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;yChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;widthChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;heightChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> viewRect<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:Rectangle<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> _viewRect;<br />
<span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> x<span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>_viewRect.<span style="color: #006600;">x</span> <span style="color: #66cc66;">!</span>= value<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; _viewRect.<span style="color: #006600;">x</span> = value;<br />
&nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;xChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> y<span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>_viewRect.<span style="color: #006600;">y</span> <span style="color: #66cc66;">!</span>= value<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; _viewRect.<span style="color: #006600;">y</span> = value;<br />
&nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;yChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">width</span><span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>_viewRect.<span style="color: #0066CC;">width</span> <span style="color: #66cc66;">!</span>= value<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; _viewRect.<span style="color: #0066CC;">width</span> = value;<br />
&nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;widthChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">height</span><span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>_viewRect.<span style="color: #0066CC;">height</span> <span style="color: #66cc66;">!</span>= value<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; _viewRect.<span style="color: #0066CC;">height</span> = value;<br />
&nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;heightChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В этом примере биндинг для свойства viewRect сработает в случае изменения любого из свойств x, y, width или height.</p>
<p>На этом пока все, продолжение следует.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/YBd57JQuRJE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/binding-v-actionscript-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/binding-v-actionscript-2/</feedburner:origLink></item>
		<item>
		<title>Unity вперед!</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/brbWOWExWhI/</link>
		<comments>http://blog.diestro.ru/unity-go/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 06:02:32 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Molehill]]></category>
		<category><![CDATA[Unity]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=312</guid>
		<description><![CDATA[Как стало недавно известно Adobe выпустила пререлиз нового флэш плеера &#8220;Incubator&#8221; с поддержкой API Molehill. Практически сразу же после этого Unity, занимающегося разработкой альтернативного плагина с поддержкой 3D, объявила что будет поддерживать экспорт проектов в формат Flash-плеера. В этой публикации не дается никаких упоминаний о том когда эта возможность полноценно появится в Unity. Может ли [...]]]></description>
			<content:encoded><![CDATA[<p>Как стало недавно известно Adobe выпустила <a href="http://labs.adobe.com/technologies/flashplatformruntimes/incubator/">пререлиз нового флэш плеера &#8220;Incubator&#8221;</a> с поддержкой API Molehill. Практически сразу же после этого Unity, занимающегося разработкой альтернативного плагина с поддержкой 3D, <a href="http://blogs.unity3d.com/2011/02/27/unity-flash-3d-on-the-web/">объявила</a> что будет поддерживать экспорт проектов в формат Flash-плеера. В этой публикации не дается никаких упоминаний о том когда эта возможность полноценно появится в Unity.</p>
<p>Может ли это привести к вымиранию Unity как плагина к браузеру? В Unity говорят что никак нет, но упоминают о том что в ихней среде разработки помимо родного C# появится и поддержка ActionScript! По сути весь написанный код на C# или Javascript будет переводиться в ActionScript и после этого собираться компилятором.</p>
<p>Так что нас с вами ждет новая среда для создания Flash приложений. Чтож, Unity вперед! <img src='http://blog.diestro.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/brbWOWExWhI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/unity-go/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/unity-go/</feedburner:origLink></item>
		<item>
		<title>Биндинг в ActionScript проектах. Часть 1</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/SbomWJxJY4s/</link>
		<comments>http://blog.diestro.ru/binding-v-actionscript-1/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 17:49:33 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[binding]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=269</guid>
		<description><![CDATA[Перед разработчиками часто встает вопрос о взамодействии различных классов в приложении. Как классы приложения будут обмениваться информацией между собой, сообщать о тех или иных изменениях? Это должно происходить своевременно. Для этих целей во Flex-фреймворке есть замечательный инструмент, значительно облегчающий жизнь разработчику &#8211; биндинг (binding). И как оказалось этой возможностью можно с успехом пользоваться и без [...]]]></description>
			<content:encoded><![CDATA[<p>Перед разработчиками часто встает вопрос о взамодействии различных классов в приложении. Как классы приложения будут обмениваться информацией между собой, сообщать о тех или иных изменениях? Это должно происходить своевременно. Для этих целей во Flex-фреймворке есть замечательный инструмент, значительно облегчающий жизнь разработчику &#8211; биндинг (binding). И как оказалось этой возможностью можно с успехом пользоваться и без использования Flex-фреймворка. Начиная с какой-то-там одной из третьих версий SDK адобовцы постарались максимально изолировать биндинг и все что с ним связано, и теперь его использование добавляет приложению считанные килобайты.</p>
<p><span id="more-269"></span></p>
<h2>Как бы мы сделали</h2>
<p>Немного отвлечемся и поговорим о частном случае. Когда же нам может все это дело пригодиться? Например, при разработке с использованием паттерна MVC встает вопрос о своевременном реагировании компонентов отображения на изменения в модели.</p>
<p>Как известно в MVC классы модели ничего не должны знать и не иметь ссылок ни на классы контроллера, ни на классы отображения. А вот на модель имеют ссылку и контроллер и отображение. Контроллеру нужна ссылка для того чтобы изменить модель, отображению &#8211; чтобы отреагировать на изменения. С изменением модели вроде все понятно &#8211; нужно поменять свойство. Но как отображение узнает о том что данные были изменены, чтобы самому измениться? Как правило для этих целей используются события.  Мы создаем в модели сеттер на нужное нам свойство и в тот момент когда свойство меняется &#8211; посылаем соответствующее событие:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _text:<span style="color: #0066CC;">String</span>;<br />
<br />
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">text</span> <span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>value == _text<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; _text = value;<br />
&nbsp; &nbsp; dispatchEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Event<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;textChanged&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>Класс отображения имея ссылку на модель может поймать данное событие и отреагировать на него соответствующим образом. Все вроде хорошо, но есть ряд неудобств:</p>
<ol>
<li>Для каждого свойства в модели придется писать геттер/сеттер. А это много рутинной писанины, класс начинает пухнуть.</li>
<li>При большом количестве свойств в модели будет либо расти количество типов событий, либо придется делать кастомное событие и передавать дополнительно что же именно изменилось и новое значение. В любом случае неудобно.</li>
</ol>
<h2>Как это делается с помощью биндинга</h2>
<p>А как же все таки было бы здорово просто написать в классе отображения: &#8220;при изменении вот этого свойства вон в том экземпляре класса изменить вот это свойство&#8221; или вот так: &#8220;при изменении вот этого свойства вон в том экземпляре класса вызвать вот этот метод для обработки&#8221;. Так вот стандартный флэксовый биндинг работает именно так.</p>
<p>Давайте посмотрим как это будет выглядеть непосредственно в коде. То свойство за которым нам необходимо пристально следить нужно пометить как bindable. Делается это очень просто, с помощью метатега [Bindable]:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">EventDispatcher</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Класс который использует метатег [Bindable] должен обязательно расширяться от EventDispatcher</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ClassWithTextProperty <span style="color: #0066CC;">extends</span> EventDispatcher<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">text</span>:<span style="color: #0066CC;">String</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В классе который должен следить за свойством text в другом классе будет написано следующее:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">binding</span>.<span style="color: #006600;">utils</span>.<span style="color: #006600;">BindingUtils</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MyClass<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">//Экземпляр класса со свойством text, за которым нужно следить</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> classWithTextProperty:ClassWithTextProperty = <span style="color: #000000; font-weight: bold;">new</span> ClassWithTextProperty<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Свойство которое будет изменяться при изменении свойства text в экземпляре classWithTextProperty</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> myText:<span style="color: #0066CC;">String</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> MyClass<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Та самая строчка, которая позволяет связать свойство myText со свойством text</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BindingUtils.<span style="color: #006600;">bindProperty</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, <span style="color: #ff0000;">&quot;myText&quot;</span>, classWithTextProperty, <span style="color: #ff0000;">&quot;text&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В примере выше используя BindingUtils.bindProperty мы связываем свойство text со свойством myText, и теперь при изменении свойства text в экземпляре classWithTextProperty автоматически будет меняться и значение свойства myText. Здорово, правда?</p>
<p>Кратко расшифрую параметры принимаемые методом</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bindProperty(site:Object, prop:String, host:Object, chain:Object, commitOnly:Boolean = false, useWeakReference:Boolean = false):ChangeWatcher</div></div>
<p>Параметры:</p>
<p style="padding-left: 30px;"><strong>site</strong>: объект содержащий свойство для изменения;<br />
<strong>prop</strong>: свойство для изменения;<br />
<strong>host</strong>: объект, содержащий свойство за которым необходимо следить;<br />
<strong>chain</strong>:  в самом простом случае содержит строку с именем переменной, за которой нам необходимо следить. Возможны варианты указания цепочек в виде массива.</p>
<p>Есть еще свойство <strong>commitOnly</strong> на котором я подробно останавливаться в рамках данной статьи не буду и свойство <strong>useWeakReference</strong> &#8211; это то же самое что мягкие ссылки для событий, принцип тот же.</p>
<p>Возвращает данный метод экземпляр класса ChangeWatcher. Иногда сохранять возвращаемый экземпляр бывает очень полезно. Это нужно для того, чтобы мы смогли в любой момент &#8220;разбиндить&#8221; установленную связь и отписаться от изменений. Для этого у класса ChangeWatcher есть метод unwatch().</p>
<p>Второй вариант установления слежки за свойством text будет вызов нужного нам метода при его изменении.</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">binding</span>.<span style="color: #006600;">utils</span>.<span style="color: #006600;">BindingUtils</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MyClass<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Свойство со ссылкой на &nbsp;экземпляр класса со свойством text, за которым нужно следить</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> classWithTextProperty:ClassWithTextProperty = <span style="color: #000000; font-weight: bold;">new</span> ClassWithTextProperty<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> MyClass<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Та самая строчка, которая позволяет вызвать метод onTextChanged при каждом изменении свойства text</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BindingUtils.<span style="color: #006600;">bindSetter</span><span style="color: #66cc66;">&#40;</span>onTextChanged, classWithTextProperty, <span style="color: #ff0000;">&quot;text&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onTextChanged<span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;The new text value is: &quot;</span> + value<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>В данном примере при каждом изменении свойства text в экземпляре classWithTextProperty, будет вызываться метод onTextChanged где в консоль будет выводиться её новое значение.</p>
<p>Кратко расшифрую параметры принимаемые методом</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bindSetter(setter:Function, host:Object, chain:Object, commitOnly:Boolean = false, useWeakReference:Boolean = false):ChangeWatcher</div></div>
<p>Параметры</p>
<p style="padding-left: 30px;"><strong>setter</strong>: метод, вызываемый при изменении указаного свойства или цепочки;<br />
<strong>host</strong>: объект, содержащий свойство за которым необходимо следить;<br />
<strong>chain</strong>:  в самом простом случае содержит строку с именем переменной, за которой нам необходимо следить. Возможны варианты указания цепочек в виде массива.</p>
<p>Чаще всего используется именно метод bindSetter, он более гибкий и позволяет произвести нужную последовательность действий при изменении того или иного свойства.</p>
<h2>Библиотека</h2>
<p>А как же собственно использовать всю эту красоту в ваших ActionScript проектах? Есть вариант подключить все флэксовые библиотеки к вашему проекту в которых есть все необходимое для работы биндинга, но это очень скользкий путь, чреватый тем что в один прекрасный момент могут потянуться хвостом куча ненужных вам флэксовых классов, увеличивая размер конечной флэшки до немыслимых размеров. Гораздо надежнее собрать библиотеку из нужных для работы биндинга классов и использовать ее, не боясь что неожиданно потянутся хвосты, что собственно я и сделал. Размер получившейся библиотеки <a href="http://blog.diestro.ru/upload/binding.swc">binding.swc</a> получается порядка 15 Кбайт, а это не может не радовать. Таким образом использование биндинга незначительно влияет на объем конечной флэшки. Все что нужно сделать это подключить данную библиотеку к вашему проекту и &#8220;Вперед и с песней!&#8221;.<br />
<a name="how"></a></p>
<h2>Как это работает?</h2>
<p>На самом деле ничего уникального в работе флэксового биндинга нет. Выше был описан класс  ClassWithTextProperty. Так вот компилятор перед тем как откомпилировать проект преобразует этот класс к следующему виду:</p>
<div class="codecolorer-container actionscript mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">package<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">EventDispatcher</span>;<br />
&nbsp; &nbsp; <span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">PropertyChangeEvent</span>;<br />
<br />
&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ClassWithTextProperty <span style="color: #0066CC;">extends</span> EventDispatcher<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _text:<span style="color: #0066CC;">String</span>;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#40;</span>newValue:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> oldValue:<span style="color: #66cc66;">*</span> = <span style="color: #0066CC;">this</span>._text;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>oldValue <span style="color: #66cc66;">!</span>== newValue<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">this</span>._text = newValue;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">this</span>.<span style="color: #006600;">dispatchEvent</span><span style="color: #66cc66;">&#40;</span>PropertyChangeEvent.<span style="color: #006600;">createUpdateEvent</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, <span style="color: #ff0000;">&quot;text&quot;</span>, oldValue, newValue<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0066CC;">this</span>._text;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div></td></tr></tbody></table></div>
<p>Посмотрев на код видно что он делает тоже самое, о чем мы говорили вначале &#8211; посылает событие в результате изменения свойства text. Посредством BindingUtils мы по сути подписываемся на это событие и в результате либо меняется нужное нам свойство (bindProperty), либо вызывается нужый для обработки метод (bindSetter). Поэтому использование биндинга для разработчика это по сути упрощение рутинных действий по описанию и отлавливанию событий. Для того чтобы отловить изменение нужного нам свойства достаточно добавить две строки (метатег [Bindable] к свойству и BindingUtils.bind&#8230; в классе-обработчике) + добавить метод обработки в случае использования bindSetter.</p>
<h2>Все должно быть в меру</h2>
<p>При использовании биндинга, естественно, это нужно делать разумно и не вешать метатег [Bindable] на все свойства подряд. Важно помнить что в каждом таком случае при изменении этого свойства будет посылаться событие, а это лишняя нагрузка.</p>
<p>Из личного опыта бинднг в чистых ActionScript проектах используется очень часто и практически везде где это необходимо. При грамотном и осторожном его использовании нагрузка на процессор минимальна и незаметна.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/SbomWJxJY4s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/binding-v-actionscript-1/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/binding-v-actionscript-1/</feedburner:origLink></item>
		<item>
		<title>Новая книга “ActionScript 3.0. Шаблоны проектирования”</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/PRcgqSbIiNU/</link>
		<comments>http://blog.diestro.ru/novaya-kniga-actionscript-3-0-shablony-proektirovaniya/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 16:26:57 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[книги]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=264</guid>
		<description><![CDATA[В феврале ожидается выход новой книги &#8220;ActionScript 3.0. Шаблоны проектирования&#8221;. В свое время я читал англоязычный вариант данной книги &#8220;ActionScript 3.0 Design Patterns&#8221; и почерпнул для себя много нового и полезного. Данная книга будет интересна не только ActionScript разработчикам. Для тех кто хочет получить очередной профит книга к прочтению будет обязательна! Ждем с нетерпением.]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="ActionScript 3.0. Шаблоны проектирования" src="http://files.books.ru/pic/816001-817000/816636/816636.jpg" alt=""/>В феврале ожидается выход новой книги  &#8220;ActionScript 3.0. Шаблоны проектирования&#8221;. В свое время я читал англоязычный вариант данной книги &#8220;ActionScript 3.0 Design Patterns&#8221; и почерпнул для себя много нового и полезного. Данная книга будет интересна не только ActionScript разработчикам.</p>
<p>Для тех кто хочет получить очередной профит книга к прочтению будет обязательна!</p>
<p>Ждем с нетерпением.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/PRcgqSbIiNU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/novaya-kniga-actionscript-3-0-shablony-proektirovaniya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/novaya-kniga-actionscript-3-0-shablony-proektirovaniya/</feedburner:origLink></item>
		<item>
		<title>Новый Flash Builder “Burrito” 2</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/1rRWJdz_zro/</link>
		<comments>http://blog.diestro.ru/novyj-flash-builder-%e2%80%9cburrito%e2%80%9d-2/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 06:33:11 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/novyj-flash-builder-%e2%80%9cburrito%e2%80%9d-2/</guid>
		<description><![CDATA[Команда разработчиков Flash Builder продолжает радовать, появилось еще два ролика о новых возможностях &#8220;Burito&#8221; в плане удобства редактирования кода. Автокомплит метатегов: Темплейты кода, называемые также сниппетами: В каждом видео по прежнему присутствует предупреждение о том что никаких гарантий что это все будет в новой версии нету. Хм.]]></description>
			<content:encoded><![CDATA[<p>Команда разработчиков Flash Builder продолжает радовать, появилось еще два ролика о новых возможностях &#8220;Burito&#8221; в плане удобства редактирования кода.<br />
Автокомплит метатегов:</p>
<p><iframe src="http://player.vimeo.com/video/14746946" width="500" height="313" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe></p>
<p>Темплейты кода, называемые также сниппетами:</p>
<p><iframe src="http://player.vimeo.com/video/14746991" width="500" height="313" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe></p>
<p>В каждом видео по прежнему присутствует предупреждение о том что никаких гарантий что это все будет в новой версии нету. Хм.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/1rRWJdz_zro" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/novyj-flash-builder-%e2%80%9cburrito%e2%80%9d-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/novyj-flash-builder-%e2%80%9cburrito%e2%80%9d-2/</feedburner:origLink></item>
		<item>
		<title>Новый Flash Builder “Burrito”</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/CIzTUSQmq7o/</link>
		<comments>http://blog.diestro.ru/novyj-flash-builder-%e2%80%9cburrito%e2%80%9d/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 06:40:50 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=252</guid>
		<description><![CDATA[Появилась информация о том что команда разработчиков Flash Builder работает над новой версией с кодовым названием &#8220;Burrito&#8221;. Судя по видео, с кодом станет работать намного легче: Немного смущает в первых кадрах текст о том, что никаких гарантий что все показанные &#8220;плюшки &#8221; будут работать в новой версии Flash Builder.]]></description>
			<content:encoded><![CDATA[<p>Появилась <a href="http://blogs.adobe.com/flex/2010/09/flash-builder-codename-burrito.html" target="_blank">информация</a> о том что команда разработчиков Flash Builder работает над новой версией с кодовым названием &#8220;Burrito&#8221;. Судя по видео, с кодом станет работать намного легче:</p>
<p><iframe src="http://player.vimeo.com/video/14746937" width="500" height="313" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe></p>
<p>Немного смущает в первых кадрах текст о том, что никаких гарантий что все показанные &#8220;плюшки &#8221; будут работать в новой версии Flash Builder.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/CIzTUSQmq7o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/novyj-flash-builder-%e2%80%9cburrito%e2%80%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/novyj-flash-builder-%e2%80%9cburrito%e2%80%9d/</feedburner:origLink></item>
		<item>
		<title>Доступна русскоязычная документация для Flash Builder 4</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/W5k8CzGyt6o/</link>
		<comments>http://blog.diestro.ru/rus-doc-flash-builder-4/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 11:41:57 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Flash Builder 4]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=246</guid>
		<description><![CDATA[С выпуском релизной версии Flash Builder 4 на сайте Adobe появилась русскоязычная документация по Flash Builder. К сожалению переведено не все, но справочник уже можно использовать.]]></description>
			<content:encoded><![CDATA[<p>С выпуском <a href="http://www.adobe.com/products/flex/" target="_blank">релизной версии Flash Builder 4</a> на сайте Adobe появилась <a href="http://help.adobe.com/ru_RU/Flex/4.0/AccessingData/WS4bebcd66a74275c31ce8701d123721e6814-8000.html" target="_blank">русскоязычная документация</a> по Flash Builder. К сожалению переведено не все, но <a href="http://help.adobe.com/ru_RU/AS3LCR/Flex_4.0/index.html" target="_blank">справочник</a> уже можно использовать.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/W5k8CzGyt6o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/rus-doc-flash-builder-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/rus-doc-flash-builder-4/</feedburner:origLink></item>
		<item>
		<title>Релиз Adobe Flash Builder 4</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/18CnFQD9kvk/</link>
		<comments>http://blog.diestro.ru/reliz-adobe-flash-builder-4/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 08:18:20 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Flash Builder 4]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=242</guid>
		<description><![CDATA[Вышел Adobe Flash Builder 4. Уже несколько дней упорно  грызу гранит бета-версии. А тут такое счастье привалило. Теперь ждем релиз Adobe Catalyst.]]></description>
			<content:encoded><![CDATA[<p>Вышел <a href="http://www.adobe.com/products/flex/" target="_blank">Adobe Flash Builder 4</a>. Уже несколько дней упорно  грызу гранит бета-версии. А тут такое счастье привалило. Теперь ждем релиз Adobe Catalyst.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/18CnFQD9kvk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/reliz-adobe-flash-builder-4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/reliz-adobe-flash-builder-4/</feedburner:origLink></item>
		<item>
		<title>Плагин Sourcemate для Flash Builder 4</title>
		<link>http://feedproxy.google.com/~r/diestro/~3/WvyxOlXecxM/</link>
		<comments>http://blog.diestro.ru/sourcemate_dlya_flash_builder_4/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 12:27:22 +0000</pubDate>
		<dc:creator>Diestro</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Flash Builder 4]]></category>
		<category><![CDATA[SourceMate]]></category>
		<category><![CDATA[сниппеты]]></category>

		<guid isPermaLink="false">http://blog.diestro.ru/?p=231</guid>
		<description><![CDATA[Отличная новость от Lee Brimelow! Flash Builder 4 еще в бете, а для него уже существует плагин, дополняющий его тем чего нам так не хватало &#8211; сниппеты, рефакторинг, генерация геттеров/сеттеров, автокомплит метатегов и др. Именно из-за нехватки подобных вещей многие использовали FDT либо вместо, либо вместе с Flex Builder, что доставляло ряд неудобств. Новый плагин [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.elementriver.com/sourcemate/" target="_blank"><img class="alignnone" src="http://blog.diestro.ru/wp-content/images/sourcemate.jpg" alt="Sourcemate" width="387" height="65" /></a><br />
Отличная <a href="http://theflashblog.com/?p=1830">новость от Lee Brimelow</a>! Flash Builder 4 еще в бете, а для него уже существует плагин, дополняющий его тем чего нам так не хватало &#8211; сниппеты, рефакторинг, генерация геттеров/сеттеров, автокомплит метатегов и др. Именно из-за нехватки подобных вещей многие использовали FDT либо вместо, либо вместе с Flex Builder, что доставляло ряд неудобств.</p>
<p>Новый плагин называется <a href="http://www.elementriver.com/sourcemate/">SourceMate</a>. Стоит денег. 30 дней можно пощупать бесплатно. Ставится через <strong>Help &gt; Install New Software</strong> -&gt; <strong>Search for new features to instal</strong>l -&gt; <strong>Next</strong> -&gt; <strong>New remote site</strong> -&gt; указываем url: <strong>http://updates.elementriver.com/sourcemate/v1</strong> устанавливаем, щупаем.</p>
<p>Не скажу что плагин, в том виде в котором он есть сейчас, богат функционалом, но то что появились сниппеты в виде темплейтов кода, а как мне кажется это наиболее удобный способ работы со сниппетами, это просто потрясающе.</p>
<img src="http://feeds.feedburner.com/~r/diestro/~4/WvyxOlXecxM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.diestro.ru/sourcemate_dlya_flash_builder_4/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.diestro.ru/sourcemate_dlya_flash_builder_4/</feedburner:origLink></item>
	</channel>
</rss>

