好问题。假设您的代码如下所示:
public function get dataArr():Array
{
return _dataArr;
}
public function set dataArr(val:Array):void
{
dispatchEvent(new Event(Event.CHANGE));
_dataArr = val;
}
现在让我们假设你有一个对象,比如说model
包含这些函数。请记住,get
函数set
基本上是语法糖。所以即使有些东西看起来像一个简单的赋值,它仍然是一个函数调用。
// like calling some function model.setDataArr([1, 2, 3, 4, 5]);
// so event gets dispatched
model.dataArr = [1, 2, 3, 4, 5];
// liek calling some function model.getDataArr().push(6);
// so setter never gets called and thus event is not dispatched.
model.dataArr.push(6);
所以简而言之,当你做类似shift
的push
事情时,事件不会被调度。model.dataArr
使用 get 函数返回您的数组,然后您在返回的数组上调用方法。由于 set 函数永远不会被调用,因此事件永远不会被调度。
您可以在整个 AS3 API 中看到类似的场景。以DisplayObject#transform为例。当您只是执行诸如dispObj.transform.matrix.tx += 10
内部设置函数之类的操作时,永远不会调用并且没有影响。因此,您必须实际dispObj.transform = someTransform
为 set 函数分配一个新的转换才能被调用。这同样适用于您 - 您必须为要调用的 set 函数和调度事件实际分配一些数组。