我正在尝试创建一个可以从mxml代码中接收附加值的组件:
public class Board extends Canvas
{
public var boardSize:Number;
private var cellWidth:Number;
public function Board()
{
super();
}
}
如何从mxml代码传递boardSize值。 e.g。
<MyComp:Board x="22" y="25" width="600" height="600" boardSize="19">
但它不起作用。当我尝试调试代码时,我发现boardSize变量是类
中的NaN答案 0 :(得分:3)
你什么时候测试?如果通过在构造函数中放置断点来测试代码,则boardSize应为null。就像你的代码一样,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 :(得分:1)
只是详细说明Dan Monego的回答和评论。将类更改为类似下面的类。然后你可以在set函数上设置一个断点。
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();
}
}
答案 2 :(得分:0)
试试这个:
<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}">
问题可能是你将它作为字符串传递给组件,它没有意识到它是一个数字。
答案 3 :(得分:0)
我认为要获得mxml代码完成,您需要在您想要的属性上方添加[Inspectable]元标记。
[Inspectable(defaultValue="", type="Number", name="boardSize", format="Number")]
public var boardSize:Number;
试试这个,让我知道你是怎么做的。加载有关此类组件开发的更多信息here
答案 4 :(得分:0)
如果查看构造函数,它没有参数,因此您需要使用属性或公共变量来设置值。如果要使用参数创建自定义组件,则必须创建不同的构造函数,如下所示。不要认为可以使用mxml中的args调用构造函数,但是使用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;
}
}
答案 5 :(得分:0)
您最有可能想要访问此属性的位置是在组件的设置和子项的创建过程中 - 因为“creationComplete”应该在您完成之后已经存在:) 为此,重写createChildren()方法。另外,您可能还想为它创建一个setter(或者至少绑定它)以捕获更改。
示例:
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);
}
}}
请注意,在此示例中,设置boardSize()在createChildren之前调用 - 因此,如果您使用boardSize更改您的子项,则应确保它们实际上已存在于此setter中。