SCORM 2.0 needs to learn lessons from the past:
Three simple steps to relevance:
I have little hope that such a simple recipe will emerge from LETSI, but from my ivory tower this is the only way I can see the ocean. However, there is great conversation taking place and that’s reason to hope. I encourage everyone interested in the space to check out the links below.
LETSI Call for White Papers / White Papers:
Aaron Silvers – Get Involved:
Tom King – Get Involved + War of Words:
I’ve got lots of respect for Tom King, but I’d say he’s underselling the depth of the problem. In my view, DOD dollars are the only thing propping up the current system.
I’m not sure I’ve ever met anyone, outside the DOD / ADL who doesn’t think SCORM and AICC are over engineered pieces of junk. And the LMS / LCMS products and vendors engender pure hate at every contact point whether purchaser, content develoeprs, admins or end users. Do a couple of white-papers do anything to help remedy the situation?
Those who work in the eLearning field, know that Flash SCO (Shareable Content Object) to LMS (Learning Management System) communication is an ugly mess. The SCORM RTE specification requires JavaScript as the communication bridge between a SCO and and the LMS. JavaScript is asynchronous in nature which means that any time you make a request for information from the LMS you must enter into some type of “loop” waiting for a response–typically this takes the form of an interval, or a frame based loop. In the past I’ve used setInterval to evaluate whether properties returned from the LMS have changed, but this always felt rather ugly to me so I decided to implement an event based system which uses Object.watch and EventDispatcher. Here’s what I came up with:
/**
* @author Paul Brooks Andrus
* Creative Commons License
* http://creativecommons.org/licenses/by/2.5/
* This work is licensed under a Creative Commons Attribution 2.5 License
* June 6, 2005
*/
import mx.events.EventDispatcher;
import mx.utils.Delegate;
class Watcher {
function dispatchEvent(){};
function addEventListener(){};
function removeEventListener(){};
function Watcher() {
EventDispatcher.initialize(this);
}
/*
* Creates a watched property using the scope of the first parameter
*
*/
public function watchProp(s:Object, p:String):Void {
s.watch(p, Delegate.create(this,returnProperty), s);
}
/*
* Removes watch from the scope defined by the 4th parameter, returns
* the value of the watched property and dispatches an event object
* with all the information from the watch
*
*/
public function returnProperty(p:String,ov:String,nv:String,s:Object){
s.unwatch(p);
dispatchEvent({type:"change", prop:p,value:nv,old:ov});
return nv;
}
}
The solution, as you can see, is simple, reusable, very clean and allows the use of the familiar event-listener model. You can download the source here.