【Angular2】AnswerSheet组件

前端之家收集整理的这篇文章主要介绍了【Angular2】AnswerSheet组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

引言

【Angular2】试卷整体设计中说到AnswerSheet组件的卡功能是可以显示用户对每道题答题状态,点击答题卡可以定位到相应题目;

同时,这里也有一些组件交互的问题需要讨论

功能要求

1.显示用户对每道题答题状态;
2.点击答题卡可以定位到相应题目;

代码说明

html code

<div id="answer_sheet"> <div class="sidebar_title">答题卡</div> <div *ngIf="exampaper"> <div *ngFor="let qt of exampaper.paperQuestionTypeList; let i=index"> <div class="cards"> <h4>{{USN[i]+qt.questionTypeName}}</h4> <div *ngFor="let qm of qt.questionMainList; let j=index"> <!-- 题干没有子题干 --> <!-- <div id="{{qm.id}}" class="card" (click)="locateQuestion($event.target)">{{j+1}}</div> --> <!-- 题干有子题干,进行判断 --> <div *ngIf="qm.questionSubList[0]"> <div id="{{qm.id}}" class="card" (click)="locateQuestion($event.target)">{{j+1}}</div> </div> <div *ngIf="!qm.questionSubList[0]"> <div *ngFor="let qs of qm.smallquestionMainList; let k=index"> <div id="{{qs.id}}" class="card" (click)="locateQuestion($event.target)">{{k+1}}</div> </div> </div> </div> <div style="clear:both;"></div> </div> <br/> </div> </div> </div>

html 说明

这里就是对数据的循环处理,需要注意的数据中的子题干问题,因为答题卡也是通过试卷实体来遍历出要显示内容

这里简单说一下试卷实体,包括题型实体集合,题型集合中包括题干实体集合,题干实体包括选项实体集合和子题干实体集合,子题干实体集合又包括子题干实体集合和选项集合…所以遍历的时候需要依自己数据类型而定;


ts code

@Input() exampaper: ExamPaperModel;
  @Input() updatedAnswer: Answer;
  USN = UpSerialNumber; //大题题号(汉字)

  /* 监测父组件提供输入值的变化 */
  ngOnChanges(changes: { [propKey: string]: SimpleChange }) {
    for (let propName in changes) {
      let changedProp = changes[propName];
      let answer = <Answer>changedProp.currentValue;
      if (!changedProp.isFirstChange()) {
        let el = document.getElementById(answer.questionMainId);
        if(answer.done){
          if (el != null) { el.setAttribute("class","card_done"); }
        }else{
          if (el != null) { el.setAttribute("class","card"); }
        }
      } 
    }
  }

  /* 定位到问题位置 */
  locateQuestion(el: Element){
    let questionid: string = el.getAttribute("id");
    let questiondiv = document.getElementsByName(questionid);
    questiondiv[0].scrollIntoView(true);//true:元素顶部与窗口顶部齐平;false:元素底部与窗口底部齐平
  }

ts 说明

如注释说明,通过simplechange机制来实现子组件监测父组件输入值得变化;

这里值得一提的是如果传入的是一个实体,simplechange监测的应该是实体的地址,如果是同一个实体,只改变实体里面的属性,是感知不到变化的,所以每次提交实体需要new一个新的;

小结

AnswerSheet组件就是对SimpleChange的一个应用,涉及到了组件之间的交互; 同时,需要设置好元素的id,进行相应的操作

原文链接:https://www.f2er.com/angularjs/145703.html

猜你在找的Angularjs相关文章