2

我无法使此代码在包含 Flex SDK 4.0 的 AS3.0 ( Flash ) 中工作。

 import mx.binding.utils.*;


 [Bindable]
 var myValue:int = 0;
 var cw:ChangeWatcher = BindingUtils.bindSetter(myValueChanged, this, "myValue");
 addEventListener( Event.ENTER_FRAME , ef);

 function ef(e:Event):void
 {
    trace("hello",getTimer());
    myValue = getTimer();
 }

 function myValueChanged(o:Object):void
 {
    trace("myValue: " + myValue.toString());
 }

我得到的输出是:

myValue: 0
hello 157
hello 168
hello 171
hello 177
....
....

等等。

但我希望正确的输出应该是:

myValue: 0
hello 157
myValue: 157
hello 168
myValue: 168
hello 171
myValue: 171
hello 177
myValue: 177
....
....

谢谢。

4

4 回答 4

3

数据绑定仅适用于 Flex。

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx" enterFrame="ef(event)">

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.binding.utils.*;

            [Bindable]
            public var myValue:int = 0;
            private var cw:ChangeWatcher = BindingUtils.bindSetter(myValueChanged, this, "myValue");

            private function ef(e:Event):void
            {
                trace("hello", getTimer());
                myValue = getTimer();
            }

            private function myValueChanged(o:Object):void
            {
                trace("myValue: " + myValue.toString());
            }
        ]]>
    </fx:Script>
</s:WindowedApplication>
于 2012-12-23T13:55:12.900 回答
2

我不确定 Flash Pro 编译器如何处理这些东西(我总是使用 Flex SDK 中的免费 mxmlc 编译器)。

这对你有用吗?

package
{
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.utils.getTimer;
  import mx.binding.utils.BindingUtils;

  public class BindingExample extends Sprite {

    private var model:Model;

    public function BindingExample()
    {
      model = new Model();
      BindingUtils.bindProperty(this, 'spy', model, ['value']);
      addEventListener( Event.ENTER_FRAME , onEnterFrame);
    }

    public function onEnterFrame(e:Event):void
    {
      model.value = getTimer();
    }

    public function set spy(value:int):void
    {
      trace('Bound property set to: ' + value);
    }
  }
}

class Model
{
  [Bindable]
  public var value:int;
}

如果没有,试试这个模型定义:

import flash.events.Event;
import flash.events.EventDispatcher;

class Model extends EventDispatcher
{
  private var _value:int;

  [Bindable("valueChange")]
  public function get value():int
  {
    return _value;
  }

  public function set value(value:int):void
  {
    if (_value != value)
    {
      trace('Model property set to: ' + value);
      _value = value;
      dispatchEvent(new Event("valueChange"));
    }
  }
}

如果这不起作用,请为模型尝试此操作:

import flash.events.EventDispatcher;
import mx.events.PropertyChangeEvent;
import mx.events.PropertyChangeEventKind;

class Model extends EventDispatcher
{
  private var _value:int;

  [Bindable("propertyChange")]
  public function get value():int
  {
    return _value;
  }

  public function set value(value:int):void
  {
    if (_value != value)
    {
      trace('Model property set to: ' + value);
      var oldValue:int = _value;
      _value = value;
      dispatchEvent(new PropertyChangeEvent(
        PropertyChangeEvent.PROPERTY_CHANGE, false, false,
        PropertyChangeEventKind.UPDATE, "value", oldValue, value, this));
    }
  }
}

或者,也许使用 ObjectProxy:

package
{
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.utils.getTimer;
  import mx.binding.utils.BindingUtils;
  import mx.utils.ObjectProxy;

  public class BindingExample extends Sprite {

    private var model:ObjectProxy;

    public function BindingExample()
    {
      model = new ObjectProxy({value: 0});
      BindingUtils.bindProperty(this, 'spy', model, ['value']);
      addEventListener( Event.ENTER_FRAME , onEnterFrame);
    }

    public function onEnterFrame(e:Event):void
    {
      model.value = getTimer();
    }

    public function set spy(value:int):void
    {
      trace('Bound property set to: ' + value);
    }
  }
}

使用 mxmlc 编译时,上述所有操作都可以正常工作。我会避免使用 ObjectProxy,因为它是最不安全的。

于 2012-12-27T20:09:47.840 回答
1

你写了:

我无法使此代码在包含 Flex SDK 4.0 的 AS3.0 ( Flash ) 中工作。

我认为这意味着您已经在使用 mxmlc 编译器,这是 Bindable 元标记工作所必需的。

据我了解,将 Bindable 元标记添加到变量是一种侦听 a 调度的方法PropertyChangeEvent

Flex 4.6 API 文档状态:

[在变量上使用 Bindable 时] Flex 编译器会自动为该属性生成一个名为 propertyChange、类型为 PropertyChangeEvent 的事件。

基本上是一种更简单的方法myValue.addEventListener(...)

所以我们想成为 Bindable 的变量必须是 extendsEventDispatcher或 implements的类型IEventDispatcher。原语不是这种情况,int它是您尝试使其可绑定的变量的类型。Bindable上一个是int行不通的。

为了使其工作,您可以将int变量包装在BindableInteger实现IEventDispatcher. 另一种选择是使用ObjectProxy,它允许您添加 EventListener 并使对象可绑定,即使它没有扩展EventDispatcher或实现IEventDispatcher

另外,请注意,您需要将变量设为公开、受保护或私有,才能使 Bindable 工作。

关于使用可绑定元标记的Flex 4.6 文档:

您可以在定义为变量的公共、受保护或私有属性之前使用 [Bindable] 元数据标记 (...) [b],以使该特定属性支持绑定。

这将不起作用:

[Bindable] var myValue:int = 0;

但这将:

[Bindable] public var myValue:int = o;
于 2012-12-23T14:30:34.997 回答
0

绑定适用于类属性,不适用于局部变量,因此您需要创建类:

package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.getTimer;

import mx.binding.utils.BindingUtils;
import mx.binding.utils.ChangeWatcher;

public class astest extends Sprite
{

    [Bindable]
    public var myValue:int = 0;

    public function astest()
    {
        var cw:ChangeWatcher = BindingUtils.bindSetter(myValueChanged, this, "myValue");
        addEventListener( Event.ENTER_FRAME , ef);
    }

    protected function ef(e:Event):void
    {
        trace("hello",getTimer());
        myValue = getTimer();
    }

    protected function myValueChanged(o:Object):void
    {
        trace("myValue: " + myValue.toString());
    }
}
}
于 2012-12-17T12:16:32.457 回答