js용 undo/redo 를 위한 히스토리 객체와 exec 함수

// 히스토리(history)
let h = {
p:null,
v:null,
hs:[],
i:0,
limit:40,
'save':function(){
console.log('h.save');
this._push(this.v.toJson(this.v.elements[0]));
},
'_push':function(str){
if(this.i != this.hs.length-1){
this.hs = this.hs.splice(0,this.i+1);
}
this.hs.push(str);
if(this.hs.length > this.limit){
this.hs = this.hs.splice(1);
}
this.i =  this.hs.length-1;
},
'reset':function(){
console.log('h.reset');
this.i=-1;
this.hs=[];
this.save();
},
'undo':function(){
console.log('h.undo',this.i);
if((this.i-1)<0){ console.warn('undo',(this.i-1)); return false;}
// console.log(this.hs[this.i]);
this.i--;
this.v.replaceJson(this.v.elements[0],this.hs[this.i]);
this.v.$forceUpdate();
this.v.selectedEl = null
},
'redo':function(){
console.log('h.redo',this.i);
if((this.i+1)>=this.hs.length){ console.warn('redo',(this.i+1));return false;}
// console.log(this.hs[this.i]);
this.i++;
this.v.replaceJson(this.v.elements[0],this.hs[this.i]);
this.v.$forceUpdate();
this.v.selectedEl = null

},
};




exec:function(){
  let args = [...arguments];
  let cmd = args.shift();
  if(!this[cmd] &&  typeof this[cmd] !='function' ){console.error(cmd+'라는 메소드가 존재하지 않음');}
  let r = this[cmd].apply(this,args);
  if(cmd =='load' || cmd =='reset'){
    h.reset();
  }else if(cmd =='toHtml' || cmd =='toJson' || cmd=='selectEl' || cmd=='createEl'){
    h.reset();
  }else{
    h.save();
  }
  return r;
}

----=-------
xxx.aaa(1,2,3)
->
xxx.exec('aaa',1,2,3);
처럼 바꿔 호출하면 동작(cmd)에 따라서 h.save() 등으로 히스토리 저장을 함.

댓글
  • No Nickname
    No Comment
  • 권한이 없습니다.
    {{m_row.m_nick}}
    -
제목 작성자 날짜
공대여자
공대여자
mins01
공대여자
공대여자
공대여자
공대여자
jStat 1
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자