Flex:绑定到动作脚本中的MXML-esque“绑定字符串”?

时间:2009-10-13 16:33:23

标签: flex data-binding actionscript mxml

是否可以在ActionScript中指定MXML-esque“绑定字符串”?

例如,我希望能够做到这样的事情:

MXMLBinding(this, "first_item",
            this, "{myArrayCollection.getItemAt(0)");
MXMLBinding(this, ["nameLbl", "text"],
            this, "Name: {somePerson.first} {somePerson.last}");

编辑:感谢您的回复和建议......基本上,您似乎无法做到这一点。我已经四处寻找原因。

6 个答案:

答案 0 :(得分:2)

(无耻插头)

BindageTools可以做到这一点:

Bind.fromProperty(this, "myArrayCollection", itemAt(0))
    .toProperty(this, "first_item");

Bind.fromAll(
    Bind.fromProperty(this, "somePerson.first"),
    Bind.fromProperty(this, "somePerson.last")
    )
    .format("Name: {0} {1}")
    .toProperty(this, "nameLbl.text");

请注意,BindageTools将源对象放在第一位,将目标放在最后位置(而BindingUtils将目标放在第一位,将源放在最后位置)。

答案 1 :(得分:0)

我可以使用BindingUtilsChainWatcher,但之后我会得到类似这样的代码:

…
    BindingUtils.bindSetter(updateName, this, ["somePerson", "first"]);
    BindingUtils.bindSetter(updateName, this, ["somePerson", "last"]);
…
protected function updateName(...ignored):void {
    this.nameLbl.text = "Name: " + somePerson.first + " " + somePerson.last;
}

这只是有点丑陋......第一个绑定到arrayCollection.getItemAt(0)的例子更糟糕。

答案 2 :(得分:0)

使用ChangeWatcher(例如,通过BindingUtils.bindProperty或.bindSetter)是要走的路,是的。我承认这是一个奇怪的符号,但是一旦你习惯它,它就有意义,完美运作并且非常灵活。

当然,你总是能以某种方式自己包装这些函数,如果符号错过了你 - 这两种方法都是静态的,所以以一种感觉更适合你的应用程序的方式这样做应该是一个相当简单的练习。

答案 3 :(得分:0)

BindingUtils.bindSetter方法的第一个参数(函数)是否接受匿名方法?

BindingUtils.bindSetter(function()
  {
    this.nameLbl.text = "Name: " + somePerson.first + " " + somePerson.last;
  }, this, ["somePerson", "last"]);

我讨厌匿名方法,显然它更加丑陋 - 所以即使它有效,我也不会推荐它,但只是想知道它是否有效。

答案 4 :(得分:0)

从来没有人想听到的答案,只是在ActionScript中使用getter / setter管理这些东西。使用适当的MVC,手动设置显示字段非常简单。

public function set myArrayCollection(value:Array):void {
  myAC = new ArrayCollection(value);
  first_item = mcAC.getItemAt(0);  // or value[0];
}

等...

答案 5 :(得分:0)

好吧,所以我已经做了一些挖掘,这就是最新动态。

与原因相反,MXML中的绑定是在编译时由Java代码(modules/compiler/src/java/flex2/compiler/as3/binding/DataBindingFirstPassEvaluator.java设置,如果我没有记错的话)设置的。

例如,绑定:first_item="{myArrayCollection.getItemAt(0)}“`扩展到了以下内容:

    // writeWatcher id=0 shouldWriteSelf=true class=flex2.compiler.as3.binding.PropertyWatcher shouldWriteChildren=true
    watchers[0] = new mx.binding.PropertyWatcher("foo",
                                                 { propertyChange: true }, // writeWatcherListeners id=0 size=1
                                                 [ bindings[0] ],
                                                 propertyGetter);

    // writeWatcher id=1 shouldWriteSelf=true class=flex2.compiler.as3.binding.FunctionReturnWatcher shouldWriteChildren=true
    watchers[1] = new mx.binding.FunctionReturnWatcher("getItemAt",
                                                       target,
                                                       function():Array { return [ 0 ]; },
                                                       { collectionChange: true }, 
                                                       [bindings[0]],
                                                       null);

    // writeWatcherBottom id=0 shouldWriteSelf=true class=flex2.compiler.as3.binding.PropertyWatcher
    watchers[0].updateParent(target);

    // writeWatcherBottom id=1 shouldWriteSelf=true class=flex2.compiler.as3.binding.FunctionReturnWatcher
    // writeEvaluationWatcherPart 1 0 parentWatcher
    watchers[1].parentWatcher = watchers[0];
    watchers[0].addChild(watchers[1]);

这意味着在运行时设置大括号MXML样式的绑定根本不可能,因为在ActionScript中不存在执行它的代码。