ExtJS 3.4에서 만나지 못한 버그 뽑기 (1)
4244 단어 ExtJs
헤헤, 본인은 글을 잘 쓰지 않지만, 이 버그들 때문에 나를 오랫동안 괴롭혔기 때문에, 매우 아파서, 마음속의 한을 풀기 위해 뽑아라.
본고에서 지적한 버그 복구 방식은 기존 코드를 수정하지 않고 외부에서 하나의 파일을 도입하면 된다.
이 프레임워크를 사용하고 있든 사용하지 않든 ExtJS의 버전은 3.4입니다.
또한, 나는 매일 업데이트를 보장할 수 없기 때문에 글을 쓰든 안 쓰든 내가 업무 중에 버그를 만났느냐에 달려 있다.됐어. 뽑아.
본문을 보시려면 Javascript 기초가 좀 필요합니다. 이것은 주의해야 합니다.
BUG 출처 Ext.data.DataStore
BUG 설명은 JsonWriter를 사용하여 데이터를 자동으로 저장합니다.
BUG 구성을 트리거하려면 다음과 같이 하십시오.
Ext.data.JsonWriter -> listfu : true
Ext.data.DataStore -> autoSave : true
Ext.data.DataStore -> writer 가 listfu 로 설정된 JsonWriter
위 조건을 충족하면 이 버그를 터치할 수 있습니다
트리거 환경:
Ext.data를 통해Store의remove 방법으로 두 개 이상의 데이터를 삭제할 때.
빨간색은 BUG 소스 발생 부분입니다.
Ext.data.Store
remove : function(record){
if(Ext.isArray(record)){
Ext.each(record, function(r){
this.remove(r);
}, this);
return;
}
var index = this.data.indexOf(record);
if(index > -1){
record.join(null);
this.data.removeAt(index);
}
if(this.pruneModifiedRecords){
this.modified.remove(record);
}
if(this.snapshot){
this.snapshot.remove(record);
}
if(index > -1){
this.fireEvent('remove', this, record, index);
}
},
명세서 1
관련 코드:
if (this.writer) {
this.on({
scope: this,
add: this.createRecords,
remove: this.destroyRecord,
update: this.updateRecord,
clear: this.onClear
});
}
명세서 2
destroyRecord : function(store, record, index) {
if (this.modified.indexOf(record) != -1) {
this.modified.remove(record);
}
if (!record.phantom) {
this.removed.push(record);
record.lastIndex = index;
if (this.autoSave === true) {
this.save();
}
}
},
명세서
자, 이 버그를 간단히 설명해 드릴게요. 스토어에서 이벤트remove를 자체적으로 추가했기 때문에remove에서 Record(Ext.data.Record)를 할 때remove 이벤트를 터치합니다.
명세서의 빨간색 코드 부분과 같이 이 이벤트가 호출되었습니다.이 방법은destroyRecord 방법에 전달됩니다. 이때 코드의this를 주의하십시오.autoSave 세션.
listful과 autoSave를 열었기 때문에ajax 호출을 사용합니다.
그러나 우리가 삭제한 데이터가 여러 개이기 때문에 이 호출은 여러 번 실행될 것이다.
하나를 삭제하면 한 번, 두 개를 삭제하면 두 번, 세 개를 삭제하면 세 번을 실행한다.
다음은 이 버그의 외부 코드를 복구하는 것입니다. ext-all.js 또는 ext-all-debug.js 다음에 이 코드를 도입하면 인용할 새 파일을 만들 수 있습니다.
Ext.apply( Ext.data.Store.prototype, {
_bug0_remove : function( record ) {
var index = this.data.indexOf(record);
if(index > -1){
record.join(null);
this.data.removeAt(index);
}
if(this.pruneModifiedRecords){
this.modified.remove(record);
}
if(this.snapshot){
this.snapshot.remove(record);
}
if(index > -1) {
this.fireEvent('remove', this, record, index);
}
},
// 。
remove : function(record) {
if(Ext.isArray(record)) {
Ext.each(record, function(r){
this._bug0_remove(r);
}, this);
} else {
this._bug0_remove(record);
}
if (this.autoSave === true) {
this.save();
}
},
// 。 record。
destroyRecord : function(store, record, index) {
if (this.modified.indexOf(record) != -1) {
this.modified.remove(record);
}
if (!record.phantom) {
this.removed.push(record);
record.lastIndex = index;
// ,
//if (this.autoSave === true) {
// this.save();
//}
}
},
})
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
문자열 길이를 계산하고 중국어로 두 개를 계산합니다.텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.