매일 조금씩 - EXT 소스 분석 6
자신 은 EXT 의 템 플 릿 모델 과 디자인 모델 의 템 플 릿 모델 의 실현 은 현저 한 차이 가 있 지만 그들의 사상 은 모두 똑 같 아서 변 하지 않 는 부분 과 변화 하 는 부분 을 분리 시 켜 변 하지 않 는 부분 을 잘 재 활용 할 수 있다 고 느 꼈 다.
작은 예 를 들 어 한 공업 대학 은 하나의 현수막 이 필요 하 다. 지출 을 줄 이기 위해 이 현수막 은 반복 적 으로 사용 할 수 있어 야 한다. 즉, 그 위의 글 자 는 왔다갔다 고 칠 수 있 지만 그 밑 에 있 는 빨 간 천 은 변 하지 않 는 다.
var s='<div style="width:200px;height:20px;background-color:red"><span style="color:black">{0}</span></div>';
var c=String.format(s,' XX , ');
document.write(c);
var c=String.format(s," ');
document.write(c);
Ext 는 원생 String 을 확장 하고 format 라 는 정적 방법 을 추가 하여 원본 코드 를 봅 니 다.
format : function(format){
var args = Ext.toArray(arguments, 1);
return format.replace(/\{(\d+)\}/g, function(m, i){
return args[i];
});
}
이해 하기 쉬 운 것 은 첫 번 째 매개 변수 (문자열) 에서 {\ d +} ({0}, {1}...) 와 일치 하 는 모든 문자열 을 args [1], args [2] 로 순서대로 바 꾸 는 것 입 니 다.
이렇게 해서 변 함 과 변 함 을 분리 시 켰 다.
이 함수 의 능력 은 너무 제한 되 어 있 습 니 다. 변 하 는 부분 을 삽입 할 때 처리 하려 면 이 함 수 는 분명히 무력 합 니 다.
EXT 는 두 개의 템 플 릿 클래스 를 제공 합 니 다.
Ext.Template,Ext.util.Xtemplate。
먼저 Ext. Template 류 를 살 펴 보 겠 습 니 다. 인 스 턴 스 방법 이 매우 많 고 저 에 게 도 매우 어렵 습 니 다. 먼저 중요 한 2 가 지 를 주목 하 세 요.
우선 이 종류 자 체 를 살 펴 보 자.
Ext.Template = function(html){
var me = this,
a = arguments,
buf = [];
if (Ext.isArray(html)) {
html = html.join("");
} else if (a.length > 1) {
Ext.each(a, function(v) {
if (Ext.isObject(v)) {
Ext.apply(me, v);
} else {
buf.push(v);
}
});
html = buf.join('');
}
js 의 함 수 는 정말 매우 복잡 한 것 이다. 그것 은 하나의 대상 이 되 는 방법 일 수도 있 고 그 자체 의 유일한 구조 방법 일 수도 있 으 며 그 자체 도 하나의 대상 이다.
내 가 이해 하 는 것 은 우리 가 이러한 대상 을 만 들 때 이 함 수 를 직접 호출 하 는 유일한 차이 점 은 new 가 이러한 대상 을 되 돌려 주 는 것 이다.
우리 new 가 이 템 플 릿 의 대상 이 될 때 이 구조 기 는 대충 하 는 일 은 매개 변수 에 따라 html 문자열 을 추가 하고 하나 이상 의 함수 나 속성 을 추가 할 수 있 습 니 다. 이 함수 들 은 속성 이 매우 유용 합 니 다. 삽입 할 데 이 터 를 포맷 하 는 데 사 용 됩 니 다. 사용자 정의 (this. XX) 일 수 있 습 니 다.Ext. util. format 류 의 함수 일 수도 있 습 니 다.
속성 은?complied, disableFormat 등 분석 과정의 설정 매개 변수 입 니 다.
이 템 플 릿 인 스 턴 스 가 있 으 면 인 스 턴 스 방법 을 사용 할 수 있 습 니 다. 이 때 는 동적 데 이 터 를 사용 하여 변 경 된 부분 을 입력 합 니 다. 이 때 는 포맷 함 수 를 사용 하여 동적 데 이 터 를 포맷 하고 우리 가 나타 나 고 싶 은 곳 에 표시 합 니 다.
append 실례 방법 으로 설명 하 다.
append : function(el, values, returnElement){
return this.doInsert('beforeEnd', el, values, returnElement);
},
이 때 인 스 턴 스 방법 을 호출 한 것 을 볼 수 있 습 니 다. - doInert.
doInsert : function(where, el, values, returnEl){
el = Ext.getDom(el);
var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
return returnEl ? Ext.get(newNode, true) : newNode;
},
또한 doInset 은 HTML 문자열 로 생 성 된 곳 을 찾 습 니 다. (DOM 문서 의 어디 에 두 었 는 지, 이 HTML 문자열 은 apply Template (values) 로 생 성 되 었 습 니 다.) 동적 데이터 와 포맷 으로 데 이 터 를 전송 하고 내용 이 채 워 진 구체 적 인 템 플 릿 (HTML 문자열) 을 되 돌려 주 는 기능 은 apply Template (values) 가 완 료 된 것 입 니 다.
이 apply Template (values) 를 보 세 요. 네, 이 함수 가 또 토치카 가 되 었 습 니 다. 아직도 흐릿 하 게 보 입 니 다. 정규 표현 식 이 비교적 못 배 웠 기 때 문 입 니 다. 특히 fn 에 있 는 Jack Slocum...
Ext.apply(Ext.Template.prototype, {
applyTemplate : function(values){
var me = this,//
useF = me.disableFormats !== true,//
fm = Ext.util.Format,
tpl = me;
if(me.compiled){// , ,
return me.compiled(values);
}
function fn(m, name, format, args){// , String.replace ,
if (format && useF) {// format ,
if (format.substr(0, 5) == "this.") {//
return tpl.call(format.substr(5), values[name], values);//
} else {// Ext.util.Format
if (args) {// Ext.util.Format
var re = /^\s*['"](.*)["']\s*$/;
args = args.split(',');
for(var i = 0, len = args.length; i < len; i++){
args[i] = args[i].replace(re, "$1");
}
args = [values[name]].concat(args);
} else {
args = [values[name]];
}
return fm[format].apply(fm, args);//
}
} else {
return values[name] !== undefined ? values[name] : "";
}
}
return me.html.replace(me.re, fn);//
},
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.