Flash Builder 4自动完成功能停止使用多个脚本标记

时间:2011-10-12 03:20:25

标签: flash autocomplete flash-builder intellisense mxml

在智能感知自动完成停止工作的非常特殊的情况下,我遇到了Flash Builder 4的一致问题。

当我在DataGroup中使用内联组件时会发生这种情况。 我有一个组件类的Script标签,然后,在DataGroup中,我在itemRenderer下面有一个Component标签,在该组件的class标签下有一个Script标签。此时智能感知停止工作。有没有人遇到这个并找到了解决办法?

这是一个源代码示例。 在Flash Builder中加载它,如果您遇到同样的问题,自动完成将无法在第一个脚本标记中使用。这很烦人,因为我喜欢使用内联组件。

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
 xmlns:s="library://ns.adobe.com/flex/spark" 
 xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
  <fx:Script>
    <![CDATA[
      //Try to use auto-complete
      //It doesn't work
      var p:Object;
    ]]>
  </fx:Script>
  <s:DataGroup>
    <s:itemRenderer>
      <fx:Component className="MyItemRenderer">
        <s:Group implements="mx.core.IDataRenderer">
          <fx:Script>
            <![CDATA[
              //auto-complete is ok here...
              private var _data:Object;

              public function get data():Object {
                return _data;
              }

              public function set data(value:Object):void {
                _data = value;
                invalidateProperties();
              }
            ]]>
          </fx:Script>
        </s:Group>
      </fx:Component>
    </s:itemRenderer>
  </s:DataGroup>
</s:Group>

2 个答案:

答案 0 :(得分:0)

这是因为内联项呈示器中的实现IDataRenderer。如果删除此项或创建项呈示器组件,则intellisense / autocomplete应按预期工作。

答案 1 :(得分:0)

好的,这是另一个更好的解决方法,因为它可以让我将项目渲染器代码保存在同一个mxml文件中,只需要很少的更改。我发现它很偶然。您所做的不是将项呈示器的<fx:Component>标记内联定义为<s:itemRenderer>标记的子元素,而是将其移至<fx:Declarations>标记并为其指定类名。然后,将该类名放在<s:itemRenderer>标记内。对于我来说,这比外部化项目渲染器组件要好一些。

这是一个简单的例子:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx">
  <fx:Declarations>
    <fx:Component className="PrintLine" id="printLineFactory">
      <s:Label implements="mx.core.IDataRenderer" width="100%">
        <fx:Script>
          <![CDATA[
            private var _data:Object;

            public function get data():Object {
              return _data;
            }

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

            override protected function commitProperties():void {
              super.commitProperties();
              if (_data) {
                text = String(_data);
              }
            }
          ]]>
        </fx:Script>
      </s:Label>
    </fx:Component>
  </fx:Declarations>
  <fx:Script>
    <![CDATA[
      //auto-complete works here now!
    ]]>
  </fx:Script>
  <s:layout>
    <s:VerticalLayout />
  </s:layout>
  <s:Scroller height="100">
    <s:viewport>
      <s:DataGroup width="100%">
        <s:layout>
          <s:VerticalLayout />
        </s:layout>
        <s:itemRenderer>
          PrintLine
        </s:itemRenderer>
      </s:DataGroup>
    </s:viewport>
  </s:Scroller>
</s:Application>

我必须这样做仍然是愚蠢的,我仍然讨厌Adobe。 : - (

更新: 使用类名“PrintLine”仅适用于上述代码,因为根标签是Application标签。在自定义子组件中,您需要绑定到工厂引用:

<s:itemRenderer>{printLineFactory}</s:itemRenderer>