项目作者: beatthat

项目描述 :
React wrapper component for a xapi/cmi5 assignable unit @see https://github.com/AICC/CMI-5_Spec_Current/blob/quartz/cmi5_spec.md#au_requirements
高级语言: JavaScript
项目地址: git://github.com/beatthat/react-cmi5.git
创建时间: 2018-12-17T23:48:16Z
项目社区:https://github.com/beatthat/react-cmi5

开源协议:

下载


react-cmi5

React wrapper component for an xapi/cmi5 assignable unit @see https://github.com/AICC/CMI-5_Spec_Current/blob/quartz/cmi5_spec.md#au_requirements

Integration in a React App

To integrate this cmi5 implementation in a React app, you can use these steps:

Install react-cmi5

  1. npm install --save react-cmi5

Include the cmi5.js lib

npm install react-cmi5 will have copied cmi5.js to the public folder at the root of your React project.

You must include cmi5.js in your index.html, e.g.

  1. <head>
  2. <script src="%PUBLIC_URL%/cmi5.js"></script>
  3. <!--
  4. Notice the use of %PUBLIC_URL% in the tags above.
  5. It will be replaced with the URL of the `public` folder during the build.
  6. Only files inside the `public` folder can be referenced from the HTML.
  7. Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
  8. work correctly both with client-side routing and a non-root public URL.
  9. Learn how to configure a non-root public URL by running `npm run build`.
  10. -->
  11. </head>

NOTE: the reason this is included as a downloadable script instead of a normal node package dependency is because that is how the cmi5.js lib is currently distributed (already bundled code). In a future release it would be good to tease apart the cmi5.js contents into npm packages and remove the need for the script-tag include.

Wrap a Question with Component Cmi5AssignableUnit

Include the Cmi5AU React component in your src and wrap use it to wrap a question, e.g.

  1. import React, { Component } from 'react';
  2. import './App.css';
  3. import Cmi5AU from 'react-cmi5';
  4. import ExampleQuestion from './ExampleQuestion';
  5. class App extends Component {
  6. render() {
  7. return (
  8. <div className="App">
  9. <Cmi5AU>
  10. <ExampleQuestion></ExampleQuestion>
  11. </Cmi5AU>
  12. </div>
  13. )
  14. }
  15. }
  16. export default App;

…then in your question component when you’re ready to submit a result, call one of the injected property functions passed or failed, e.g.

  1. import React, { Component } from 'react';
  2. export default class ExampleQuestion extends Component {
  3. render()
  4. {
  5. // props includes special actions for passed({score:1.0}) and failed({score: 0.0 })
  6. // These are wrappers for cmi.passed and cmi.failed
  7. // that make sure cmi has initialized before score is actually sent
  8. const {passed, failed} = this.props
  9. const onSubmit = () => {
  10. const score = this.state.score // score was set when user chose a radio-button answer
  11. if(score > 0) {
  12. this.props.passed(score)
  13. }
  14. else {
  15. this.props.failed(score)
  16. }
  17. this.props.terminate() // MUST call terminate to end the session
  18. }
  19. return (
  20. <div>
  21. question form here
  22. <button onClick={onSubmit}>submit</button>
  23. </div>
  24. )
  25. }
  26. }