好問題。讓我們假設你的代碼看起來是這樣的:
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
這樣的內部設置功能,永遠不會被調用,並且沒有任何影響。所以你必須爲set函數實際分配一個新的變換dispObj.transform = someTransform
來調用。這同樣適用於你 - 你必須實際分配一些數組來調用set函數並調用你的事件。
好的。以及我想要的基本上是當數組完成更改時調度事件。因此,假設您有一些清單頁面的排序按鈕。 model.dataArr是舞臺上實際顯示的內容。該視圖需要點擊輸入並將其發送到控制器。控制器對其進行處理,並可能在其自己的本地_controllerDataArr或_tempDataArr中更改其內容。然後說_model.dataArr = _tempDataArr現在dataArr是正確排序的數組,並且它發送視圖更改來更新自身。你會這樣做嗎? – Jimothy
這應該工作 - 只要你正在做'_model.dataArr = someArray',set函數將被調用並且調度事件。 – user1103976
不錯。謝謝。我讓你知道它是怎麼回事... – Jimothy