scormType="sco"
href="Lesson1/Module1/sco1.htm">…
代码段:
用于运行的href
对于微单元,SCORM运行模型只要求LMS使用HTTP协议运行微单元。
微单元不通过API和数据模型与LMS沟通。
对于SCO,LMS每次只能为每个学习者运行和跟踪一个SCO。
运行的SCO本身可以为其从属SCO执行API实例,从而运行和跟踪从属SCO。
LMS不负责执行从属SCO的API。
这样,LMS运行的SCO本身终止时负责所有的清除(如,关闭任何支持从属SCO的窗口)。
所有和LMS的沟通必须和LMS运行的SCO一起发生。
下图描述了LMS运行SCO1的情况和LMS如何处理SCO1的communicationsessions。
SCO1有运行SCO1.1的机制,SCO1.1也可以执行API实例。
所有SCO1.1和SCO1之间的沟通发生在彼此中。
SCO1可以确定和LMS提供的APIInstance参照返回LMS的任何其他数据沟通。
不允许SCO1.1直接通过LMS提供的APIInstance与LMS沟通。
LMS必须在把API实例作为DOM对象呈现的浏览器窗口或LMS子窗口的子框架中运行SCO。
API实例必须由LMS来提供。
SCO的任务是逐层递归查询母窗体或开启窗体直到找到API实例。
SCO一旦找到了API实例就初始化与LMS的沟通。
2.1.3清除内容对象
在learnersession结束时,学习者当前体验的内容对象将会被清除,并且会被下一个确定要传递的内容对象所取代。
内容对象被清除是一般学习者或系统触发的导航事件引起的。
当前学习对象被移除之后,LMS需要学习者与内容对象交互的确切信息作出正确的排序判断。
如果移除的内容对象是一个微单元,LMS会假定学习者的交互。
如果移除的是SCO,SCO肯定在结束learnersession时传递一些学习者的交互信息。
LMS负责解释SCO通过运行时间数据模型传递的信息,这些信息可能会下面的排序。
有时内容作者不想让用户在SCO结束之后还和它交互(无论在SCO语境中结束时什么意思)。
这种情况下,下面的活动是允许的,取决于SCO运行的窗口的类型。
A、如果SCO运行在最顶级窗口(例如,这个窗口没有父窗口,但是有一个打开者),那么SCO在要求Terminate(“”)之后将无条件关闭这个窗口。
建议LMS监视运行SCO的弹出窗口的状态,发现什么时间会发生这种事件,并呈现适当的已定义执行界面给学习者。
B、如果运行SCO的窗口不是最顶级窗口(例如,窗口有一个母窗口),SCO可以不在父窗口或任何父窗口链上运行。
例如,不允许SCO关闭最顶级窗口,只能关闭它自己的窗口。
2.2应用编程接口(API)
2.2.1API概述
SCORM描述了内容与LMS沟通的IEEEP1484.11.2-2003学习技术标准—ECMAScript应用编程接口,LMS是控制和传递学习内容的软件,它提供资源分配、时序安排、输入输出控制和数据管理。
API通过一些使用ECMAScript语言编写的API服务实现LMS与学习内容之间的数据沟通。
通用API的使用能够满足SCORM对互操作和重用的高水平要求,为SCO和LMS之间的沟通提供标准的方法,避免SCO开发者设计专门的沟通方法。
下图是API相关的三个术语:
A、API是定义的一些函数;
B、API执行是功能软件的一部分,它执行和暴露API函数。
API执行使用相同的公共接口并遵守接口的语义,使API执行功能不与SCO的开发相关。
LMS只需要提供API执行来执行API的功能并将它的公共接口暴露给客户端SCO。
C、API实例是一个单独的执行情况和API执行状态。
API实例代表在SCO操作中与SCO交互的执行软件的一部分。
API的关键作用是提供SCO和LMS的沟通机制。
SCO运行之后便可以向LMS存储和获取信息。
LMS和SCO之间的所有信息传递都由SCO发起,现在没有支持LMS调动SCO执行函数的机制。
API执行有三种函数,如下表所示:
函数
描述
SessionMethods(会话函数)
用于通过API实例标记SCO和LMS之间communicationsession的开始和结束。
Data-transferMethods(数据传递函数)
用于通过API实例交换SCO和LMS之间的数据模型值。
SupportMethods(支持函数)
用于通过API实例辅助SCO和LMS之间传递信息。
2.2.2API函数和语法
为使SCO能够在不同的LMS上运行且能够与LMS进行数据互换,必须对API做一些规定。
API必须遵守的通用要求有:
●所有函数的名字是醒目而且要准确表示;
●所有函数的参数或幅角函数要区分大小写;
●所有作为参数传递的数据应该是一个字符串。
API的主要任务是实现SCO和LMS沟通。
SCO运行之后就可以与LMS交换(获取或设置)信息。
所有API实例和SCO之间的沟通都是由SCO发起的。
或者说,SCO总是调用LMS的API实例的函数,LMS不能调用SCO定义的任何函数。
这样就不会和API实例返回的值相混淆。
这完全是对由SCO发起的调用的反映。
现在还没有支持LMS发起调用SCO执行的函数的机制。
下面详细介绍API函数:
2.2.3Session函数
SCO使用session函数初始化或终止它与API实例之间的数据沟通。
Initialize()用于初始化communicationsession,允许LMS处理特殊的初始化操作。
Terminate()用于结束communicationsession,Terminate()函数仍然延续SCO前面Initialize(“”)或Commit(“”)设置的所有数据,这样保证了SCO在LMS上连续运行。
一旦communicationsession结束了,SCO就只能调用支持函数了。
2.2.4Data-Transfer(数据传递)函数
SCO使用数据传递函数来存储和获取当前communicationsession中使用的数据。
SCO使用这些函数将运行时间数据传输给LMS或从LMS获取。
例如,LMS可以使用这个数据来帮助确定活动的完成/掌握,并且做出排序和导航的决定。
GetValue(parameter)用于向LMS请求信息。
SCO通过向LMS请求信息来确定:
LMS支持的数据模型元素的值
LMS支持的数据模型的版本
是否支持特殊的数据模型元素
SetValue(parameter_1,parameter_2)用于将LMS中parameter_2的值设置为parameter_1。
SCO通过这个函数向LMS发送并存储信息。
可以将API实例设计成在服务器端存储数据,也可以将数据存储在本地(客户端)。
Commit(parameter)用于SCO提交上次Initialize(“”)或Commit(“”)之后的连续数据,LMS将错误代码设置为“0”(没有错误发生),并返回“True”。
如果API实例不缓存值,Commit(“”)就返回“true”,并设置错误代码为“0”(没错误发生),然后处理其他进程。
由于提交数据函数的调用,缓存数据不能改变。
例如,如果SCO设置了一个数据模型元素的值,就调用提交数据函数,接着再获取这个数据模型元素的值,返回值应该是调用提交数据函数之前的值。
Commit(“”)函数可以作为SCO的预防机制,用来保证由于communicationsession中断、不正常结束或在调用Terminate(“”)之前就结束等导致SetValue()设置的值丢失之后能够还原。
2.2.5Support(支持)函数
API中Support函数使SCO能够确定错误处理和诊断信息。
使用上面的API函数有可能会出现错误。
这时就调用support函数获得错误代码来显示遇到的错误。
support函数的调用不影响错误状态。
GetLastError()可获取API实例当前错误状态的错误代码。
SCO调用这个函数时,API实例不会改变当前的错误状态,只是返回错误信息。
通常用GetLastError()来查看Session函数或Data-transfer函数是否调用成功,返回错误代码。
GetErrorString(parameter)用于获取当前错误状态的描述性信息。
SCO用它来获取错误代码为parameter的描述性信息。
API实例支持错误代码的识别。
这个函数的调用不影响错误状态,只是返回错误状态的描述信息。
GetDiagnostic(parameter)是专门为LMS所用的,它允许LMS通过API实例定义额外的诊断信息。
它的调用不影响当前错误的状态,只是返回请求的信息。
2.2.6CommunicationSession状态模型
IEEE定义了API实例在他存在期间变化的概念状态模型。
下图描述了一个SCO运行时API实例的变化状态。
API实例的状态指出API实例对应于特殊事件的转换。
每个定义的API实例状态定义了SCO可以调用的函数。
API实例遇到的状态定义为:
•NotInitialized(未初始化)
•Running(运行中)
•Terminated(结束)
注:
执行不要求执行一个状态模型。
状态模型只是一个用于帮助说明在特殊沟通session中API函数预定的动作的概念模型。
2.2.7LMS的职责
SCORM要求LMS提供IEEE标准和SCORM定义的API实例,减少SCO开发执行的难度。
SCORM要求LMS提供的API实例可以执行前面提到的对API要求的功能。
为了使SCO使用LMS提供的API实例,对LMS在什么地方以及如何提供API实例的访问也有要求。
为了提供互操作的方法来定位API实例,LMS的API实例必须可以通过DOM“API_1484_11”访问。
LMS必须为SCO提供通过ECMAScript访问API实例的功能。
为了能让SCO找到LMS提供的API实例,LMS要能在特殊的DOM层级运行SCO。
LMS窗口的子窗口或子框架包含了API实例,LMS就能在客户端窗口中运行SCO。
2.2.8SCO的职责
所有的SCO在通过API传递信息时都必须始终能够找到API实例。
因此必须限制在DOM层级中LMS提供API实例的位置并且API实例有统一的名字。
如果允许API实例存在于DOM层级的任何地方,将会很难提供一致的沟通机制和运行时间环境管理。
寻找API实例
为了使SCO开始在LMS中跟踪学习者的学习体验,SCO必须能够找到LMS提供的API实例。
因为SCORM环境中的内容对象是在网络客户端运行的,网络客户端提供一个放置API实例的DOM。
DOM可以认为是页面中对象的一个定义了的结构或组织。
为了使SCO能够在不同的LMS中找到API实例,IEEE标准限制了API实例可以存在的层级。
这个重要的事实是SCO必须在下面的位置查找API实例:
1、当前窗口的母链中,如果存在的话,直到到达母链的顶层窗口
2、开启窗口,如果有的话
3、开启窗口的母链,如果有的话,直到到达母链的顶层窗口。
SCO必须以这种方法查找API实例,并且一旦找到API实例就停止。
为了使SCO知道查找什么,IEEE标准也定义了和API执行相关的DOM中对象的必须用的名字。
API执行定义的名字是API_1484_11.
一旦SCO找到了API实例,SCO至少要调用Initialize(“”)和Terminate(“”)API。
IEEE标准提供了一些简单的ECMAScript来以一致的方式找到API实例。
没有要求必须使用ECMAScript代码。
其他的也可以。
varnFindAPITries=0;
varAPI=null;
varmaxTries=500;
varAPIVersion="";
functionScanForAPI(win)
{
while((win.API_1484_11==null)&&(win.parent!
=null)&&(win.parent!
=win))
{
nFindAPITries++;
if(nFindAPITries>maxTries)
{
alert("ErrorinfindingAPIinstance--toodeeplynested.");returnnull;
}
win=win.parent;
}
returnwin.API_1484_11;
}
functionGetAPI()
{
if((win.parent!
=null)&&(win.parent!
=win))
{
API=ScanForAPI(win.parent);
}
if((API==null)&&(win.opener!
=null))
{
API=ScanForAPI(win.opener);
if(API!
=null)
{
APIVersion=API.version;
}
}
}
使用要求和指南
SCO的构建方式多种多样,所以在开发SCO时需要考虑设计SCO如何在LMS中传递,并且学习者可能以不同的方式与SCO交互。
例如,有些SCO是一些页面的集合,允许内部页面间的导航。
这种设计,一些内容开发者可能只在首页调用Initialize(“”),在尾页调用Terminate(“”)。
如果学习体验中意外情况发生的话将会怎样?
意外情况可能是以下类型:
意外退出
用户故意的行为
突然终止
如果在调用Terminate()函数之前调用了Initialize(“”)但是不能调用Terminate()函数时,LMS就可以通过模拟函数的效果处理这些不同的假定情况,。
这样做是由于没有办法知道问题的原因——是意外,有意的动作,或只是SCO的错误?
当然,如果发生突然事件(断线或掉线)就可以将在服务器端缓存的数据通过Commit(“”)函数提交。
在API中使用Commit(“”)就是为了减少客户端和服务器之间信息传递的延迟,保证要传递的每个数据元素的值都能实时更新。
API执行提供客户端缓存,当调用了Commit(“”)函数时就传递并保持数据状态。
为减少意外行为或问题的出现,SCO开发者应该遵守以下建议:
需要记录信息时调用Commit(“”)
在SetValue()之后不要调用Commit(“”)
在Terminate(“”)之前调用Commit(“”)没有什么作用
在调用Terminate(“”)之前,SCO应该注意是否成功调用Terminate(“”)
在communicationsession期间使用SetValue()和Commit(“”),而不是在Terminate(“”)之前存储大量的数据。
2.3RTE数据模型
2.3.1数据模型概述
建立通用数据模型的目的是保证在不同的LMS环境中跟踪SCO定义的相关信息。
例如,如果要求跟踪学习者的分数,就需要为内容建立一种通用的方法来向LMS环境报告分数。
如果SCO使用一个唯一的计分法,LMS可能不知道如何接收、存储或处理信息。
SCORMRun-TimeEnvironment数据模型是基于P1484.11.1草案的,它是IEEELTSC计算机管理教学(CMI)关于内容对象沟通标准的数据模型。
P1484.11.1定义了从内容对象向LMS传递信息的数据模型的标准。
这些数据包括(但不是限制):
学习者的信息、学习者和SCO的交互信息、目标信息、成功状况和完成状况。
这些信息非常重要。
这个数据可以用于跟踪学习者的进步和状态、帮助排序和报告与SCO的全部交互。
2.3.1.1数据模型元素
为了识别数据模型,SCORMRun-TimeEnvironmentDataModel中描述的所有数据模型元素的名字都是以“cmi”开头的。
要求SCORM描述的所有的数据模型元素都可以执行,并且LMS支持他们的动作。
所有的数据模型元素都是可选择的,只要求SCO使用API函数Initialize(“”)和Terminate(“”);不要求他们使用SetValue()或GetValue().SCO可能是很小的并且本身不能被详细跟踪。
但是,如果跟踪它们,他们必须符合一个通用的数据模型来实现在多种LMS环境中的重用。
所有数据元素的名字都使用一个点符号(如.,cmi.success_status)绑定为ECMAScript字符串。
在调用SetValue()时,所有设置数据模型元素的值都绑定为ECMAScript字符串.。
ECMAScript标准支持并符合统一编码标准。
SCO和LMS需要考虑,因为这些字符串是统一编码的,他们可能包含编码出口顺序。
当在浏览器中处理任何可以提交的数据时,SCO必须考虑不同浏览器支持的编码级别和浏览器的版本。
2.3.1.2数据模型对排序的影响
SCORM排序描述了如何根据定义的排序信息、排序行为和运行内容对象时学习者的交互结果来传递一些内容对象的。
微单元对排序的影响很小,LMS只跟踪运行的微单元的情况。
微单元只要开始运行就被认为结束了。
SCO可以通过报告学习者在关于它的learnersession中的交互结果来影响排序,这是通过SCO的运行时间数据模型来完成的。
要求LMS通过SCORM运行时间环境数据模型利用SCO报告的信息来影响后来的学习活动顺序。
SCORM不规定如何以及何时使用SCO运行时间数据排序。
SCORM只规定了最近当顺序赋值时使用的信息。
下面的表格提供了对这种数据映射的特殊LMS要求,被每个数据模型元素分解的。
例如,如果SCO通过pletion_status报告学习者完成了SCO的学习,SCO确定的活动也就被认为是完成了的。
2.3.1.3处理收集到的数据
数据模型的一些元素收集了它们各自请求的数据。
每条数据纪录都是作为数组中单独的条目来处理。
通过数据纪录在列中的索引来访问数据纪录。
下面的数据模型元素定义为数据纪录的集合:
•学习者的评价(ments_from_learner)
•LMS的评价(ments_from_lms)
•目标(cmi.objectives)
•交互(cmi.interactions)
这些数据模型元素使得SCO可以跟踪多种评价、目标和/或交互。
当调用GetValue()时可能发生两种不同的错误情况:
•一般获取失败:
请求超出了范围,数据记录不存在。
例如,如果数据存在于列位置的0、1和2,SCO调用GetValue()获取位置4的信息,LMS会设置错误代码301——一般获取失败并返回空字符串。
•有初始化数据模型元素值。
请求的数据存在于列中,但是初始化值。
例如,如果SCO要求获取目标测量值(cmi.objectives.0.score.scaled),但是测量值没有初始化值。
这种情况下,目标的数据纪录存在于位置0,但是测量值