Flex: передача параметров в пользовательские компоненты - PullRequest
3 голосов
/ 02 октября 2009

Я пытаюсь создать компонент, который может получить дополнительное значение из кода mxml:

public class Board extends Canvas
{
    public var boardSize:Number;
    private var cellWidth:Number;
    public function Board()
    {
        super();

    }
}

Как передать значение boardSize из кода mxml. например,

<MyComp:Board x="22" y="25" width="600" height="600" boardSize="19">

Но это не работает. Когда я пытаюсь отладить код, я вижу, что переменная boardSize имеет значение NaN внутри класса

Ответы [ 6 ]

3 голосов
/ 02 октября 2009

Когда вы тестируете это? Если вы тестируете код, помещая точку останова в конструктор, boardSize должен быть нулевым. Как и ваш код, создание экземпляров в MXML требует, чтобы конструктор вызывался до того, как установлены какие-либо переменные-члены.

Например, попробуйте это приложение, используя класс TestObject. Когда вы запускаете его в режиме отладки, трассировка скажет вам, что n и s не установлены, но когда вы видите приложение, две метки четко связаны после того, как трассировка произошла.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:local="*">
    <mx:TraceTarget />
    <local:TestObject id="o" n="19" s="19" />
    <mx:Label text="Number Field: {o.n}" />
    <mx:Label text="String Field: {o.s}" />
</mx:Application>


package
{
    public class TestObject
    {
        [Bindable]
        public var n:Number;
        [Bindable]
        public var s:String; 

        public function TestObject()
        {
            trace("Initialized test object ...", n, s);
        }
    }
}
1 голос
/ 02 октября 2009

Просто чтобы уточнить ответ Дана Монего и комментарии. Измените класс, чтобы он выглядел как класс ниже. Затем вы можете установить точку останова на заданной функции.

public class Board extends Canvas
{
        private var _boardSize:Number;

        public function get boardSize():Number{
           return _boardSize;
        }


        public function set boardSize(val:Number):Void{
           _boardSize = val;
        }

        private var cellWidth:Number;
        public function Board()
        {
                super();

        }
}
0 голосов
/ 22 июня 2010

Место, где вы, скорее всего, захотите получить доступ к этому свойству, будет находиться во время настройки компонента и создания его дочерних элементов, поскольку "creationComplete" должен быть уже после того, как вы это сделали :) Для этого переопределите метод createChildren (). Кроме того, вы, вероятно, также захотите создать для него сеттер (или, по крайней мере, привязать его) для перехвата изменений.

Пример:

package {
  import flash.events.Event;

  public class Board extends Canvas {

  /** clever ASDoc comment goes here */
  [Bindable("boardSizeChanged")]
  [Inspectable(category="General", defaultValue="")]
  var _boardSize: Number;
  public function get boardSize(): Number {
      return _boardSize;
  }
  public function set boardSize(value: Number): void {
      if (_boardSize == value) return;
      _boardSize = value;
      // do something when boardSize changes, e.g. update child components
      trace("Boardsize is now: " + value);
      dispatchEvent(new Event("boardSizeChanged"));
  }

  public function Board() {
      super();
  }

  override protected function createChildren(): void {
      super.createChildren();
      // create your own children, using the boardSize property (this uses the getter function)
      trace("Boardsize: " + boardSize);
  }
}}

Обратите внимание, что в этом примере set boardSize () вызывается до createChildren - поэтому, если вы используете boardSize для изменения своих детей, вы должны убедиться, что они действительно уже существуют в этом установщике.

0 голосов
/ 03 октября 2009

Если вы посмотрите на ваш конструктор, у него нет аргументов, следовательно, вам нужны свойства или публичные переменные для установки значения. Если вы хотите создать свой пользовательский компонент с аргументами, вам придется создать другой конструктор, как указано ниже. Не думаю, что можно вызвать конструктор с аргументами из mxml, но с помощью ActionScript у вас могут быть необязательные параметры, которые будут устанавливать значения ...

public class Board extends Canvas
{
        public var boardSize:Number;
        private var cellWidth:Number;
        public function Board(boardSize:Number = 0, cellWidth:Number = 0)
        {
                super();
                this.boardSize = boardSize;
                this.cellWidth = cellWidth;


        }
}
0 голосов
/ 03 октября 2009

Я думаю, что для завершения mxml-кода вам нужно добавить метатег [Inspectable] над желаемым свойством.

[Inspectable(defaultValue="", type="Number", name="boardSize", format="Number")]
public var boardSize:Number;

Попробуйте и дайте мне знать, как вы поживаете. Загружает больше информации об этом типе разработки компонентов здесь

0 голосов
/ 02 октября 2009

попробуйте это:

<MyComp:Board x="22" y="25" width="600" height="600" boardSize="{Number(19)}">

или это:

<mx:Script>
<![CDATA[
public var boardSize:Number = 19;
]]>
</mx:Script>

<MyComp:Board x="22" y="25" width="600" height="600" boardSize="{boardSize}">

Проблема может заключаться в том, что вы передаете это как строку компоненту, он не понимает, что это число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...