Laiverd
%Europe/Berlin %955 %2007, 22:55
Ben bezig met het MVC model uit het boek van Moock, en wil dit toepassen op een eigen applicatie. Ik loop nu tegen een probleem aan waar ik niet uitkomen.
Vanuit de class Model die Observable extend, wordt een method notifyObservers() van Observable aangeroepen (dat werkt overigens goed), waarin onder andere een call zit naar een array 'observers'. In Observable bevindt zich ook een method addObserver() waarmee observers aan de array 'observers' worden toegevoegd. Het toevoegen van observers werkt goed; als ik ze trace binnen addObserver() krijg ik het juiste terug. Wanneer ik echter vanuit notifyObservers() de array 'observers' trace, geeft ie een lege array terug. Ik zoek me suf maar vind de oorzaak niet.
Nou is er ook binnen Observable een method removeObserver(), maar die roep ik nergens aan (gecheckt). Waar blijven de elementen van m'n array??
Even wat code
// aan begin van de class
// List of observers
private var observers : Array;
public function Observable ()
{
observers = new Array ();
}
De method addObserver() > een trace op observers aan het einde van deze functie geeft dus het goede resultaat terug
/**
* Adds an observer to the list of observers
* @param o The Observer to be added
**/
public function addObserver (o : InterfaceObserver) : Boolean
{
// can't add a null observer
if (o == null) return false;
// Don't add an observer more than once
for (var i : Number = 0; i < observers.length; i ++)
{
if (observers [i] == o)
{
// the observer is already observing
return false;
}
}
// put the observer on the list
observers.push (o);
return true;
}
De notifyObservers() method
/**
* Tell all observers that the object has changed
* @param infoObj An object containing arbitrary data to pass to observers
**/
public function notifyObservers (infoObj : Object) : Void
{
trace(observers.length) // geeft 0 terug ??????????????????//
// use a null info object if none is supplied
if (infoObj == undefined)
{
infoObj = null;
}
// If the subject hasn't changed, don't bother notifying
if ( ! changed)
{
return;
}
// make a copy of the observers array. We do this to ensure the list doesn't change while we're processing it
var observerSnapshot : Array = observers.slice (0);
clearChanged();
// invoke update on all observers. Count backward as it is faster and order doesn't matter in this case
for (var i : Number = observerSnapshot.length - 1; i >= 0; i --)
{
observerSnapshot [i].update (this, infoObj);
trace ("notified");
}
}
Vanuit Model wordt deze aangeroepen met
var infoObj : Update = new Update (_a, _b, _c, _d, _e, _f);
notifyObservers (infoObj);
Ook de aanroep slaagt dus gewoon.
Lastig debuggen hoor ;)
John
Vanuit de class Model die Observable extend, wordt een method notifyObservers() van Observable aangeroepen (dat werkt overigens goed), waarin onder andere een call zit naar een array 'observers'. In Observable bevindt zich ook een method addObserver() waarmee observers aan de array 'observers' worden toegevoegd. Het toevoegen van observers werkt goed; als ik ze trace binnen addObserver() krijg ik het juiste terug. Wanneer ik echter vanuit notifyObservers() de array 'observers' trace, geeft ie een lege array terug. Ik zoek me suf maar vind de oorzaak niet.
Nou is er ook binnen Observable een method removeObserver(), maar die roep ik nergens aan (gecheckt). Waar blijven de elementen van m'n array??
Even wat code
// aan begin van de class
// List of observers
private var observers : Array;
public function Observable ()
{
observers = new Array ();
}
De method addObserver() > een trace op observers aan het einde van deze functie geeft dus het goede resultaat terug
/**
* Adds an observer to the list of observers
* @param o The Observer to be added
**/
public function addObserver (o : InterfaceObserver) : Boolean
{
// can't add a null observer
if (o == null) return false;
// Don't add an observer more than once
for (var i : Number = 0; i < observers.length; i ++)
{
if (observers [i] == o)
{
// the observer is already observing
return false;
}
}
// put the observer on the list
observers.push (o);
return true;
}
De notifyObservers() method
/**
* Tell all observers that the object has changed
* @param infoObj An object containing arbitrary data to pass to observers
**/
public function notifyObservers (infoObj : Object) : Void
{
trace(observers.length) // geeft 0 terug ??????????????????//
// use a null info object if none is supplied
if (infoObj == undefined)
{
infoObj = null;
}
// If the subject hasn't changed, don't bother notifying
if ( ! changed)
{
return;
}
// make a copy of the observers array. We do this to ensure the list doesn't change while we're processing it
var observerSnapshot : Array = observers.slice (0);
clearChanged();
// invoke update on all observers. Count backward as it is faster and order doesn't matter in this case
for (var i : Number = observerSnapshot.length - 1; i >= 0; i --)
{
observerSnapshot [i].update (this, infoObj);
trace ("notified");
}
}
Vanuit Model wordt deze aangeroepen met
var infoObj : Update = new Update (_a, _b, _c, _d, _e, _f);
notifyObservers (infoObj);
Ook de aanroep slaagt dus gewoon.
Lastig debuggen hoor ;)
John