2013-05-23 4 views
0

저는 작은 문서 웹 사이트에서 작업 중이며 내용은 파일에 저장되어 있습니다. 예를 들어 디렉토리에 chapter1.jadechapter2.jade의 두 파일이 있습니다.비취 템플릿을 동적으로로드하십시오.

module1/ 디렉토리를 읽고 동적으로 모든 chapterX.jade 파일을 포함하고 싶습니다.

나는 내보기에 할 directory = fs.readDirSync('module1/') 다음이 시도 :

each item in directory 
    include item 

를하지만 옥 작동하지 않습니다 동적 값 (심지어`# 포함 {항목})를 지원하지 않습니다 있습니다. 이걸 어떻게 구현할 수 있니?

편집 : 나는 해결책을 preferabily보기에있을 것이라고 each 루프 (쉬운 연결을위한 앵커) 아래에 몇 가지 코드를 생성하고 싶습니다. 내가 분명히 포함 된 파일에 앵커를 수동으로 추가 할 수는 있지만 이상적이지는 않습니다. 옥으로 불가능

감사

답변

1

다음은 작동시키기 위해 수행 한 작업의 짧은 버전입니다. jade Public API을 사용합니다.

var directory = __dirname+'/views/bla/' 
    , files 
    , renderedHTML = ''; 

if(!fs.existsSync(directory)) { 
    // directory doesn't exist, in my case I want a 404 
    return res.status(404).send('404 Not found'); 
} 

// get files in the directory 
files = fs.readdirSync(directory); 

files.forEach(function(file) { 
    var template = jade.compile(fs.readFileSync(directory+file, 'utf8')); 

    // some templating 
    renderedHTML += '<section><a id="'+file+'" name="'+file+'" class="anchor">&nbsp;</a>'+template()+'</section>'; 
}); 

// render the actual view and pass it the pre rendered views 
res.render('view', { 
    title: 'View', 
    files: files, 
    html: renderedHTML 
}) 

그리고보기 그냥 html로 변수 이스케이프를 렌더링 :

div(class="component-doc-wrap") 
    !{html} 
+0

mmh, 정확하게는 아닙니다. 나는 캐시 컨트롤을 사용하기 위해 비취를 사용하고 있습니다. – Ven

+0

저는 Express/Jade에 새로 입문했습니다. 예를 들어 줄 수 있습니까? 감사! – karellm

+1

각 파일 배열에 대해 jade.renderFile()을 사용하여 문자열에 추가하고 해당 문자열을 렌더링하십시오. – Ven

0

, include은 컴파일 시간 만입니다. JS 측에서 템플릿을 생성하면됩니다.

+0

당신은 내가 게시 된 솔루션에 대해 어떻게 생각하십니까? 당신이 염두에 두었던 것입니까? – karellm

0

마찬가지로 @ user1737909는 그냥 옥을 사용하는 것은 불가능합니다.

이 (THO)을 수행하는 가장 좋은 방법은 조금 익스프레스 동적 (보기)를 구축하고있다 도우미

DEPECATED에서 명시 3.XX

확인이 : Jade - way to add dynamic includes

+0

나는이 포스트를 묻기 전에 조사를했다. 문서에 대한 링크가 작동하지 않지만 동적 헬퍼가 버전 2의 기능인 것처럼 보입니다. 최신 Express 3을 사용하고 있습니다. – karellm

+0

예, 동적 포함 제거되었습니다 – Ven

+0

다음 우리는 행운 @ kalema입니다. 편집 – jmingov

0

kalemas 이외에 당신은 또한 당신의 옥에 포함 된 파일에 포함 쓸 수 대답합니다.

이 예에서는 include를 include_all.jade에 씁니다. 이 파일은 jade 파일에 포함되어 있습니다.

작동하지 않는 경우, 경로 ;-)

예를 확인 당신의 옥 파일에

var includes = "path/to/include1\n"; 
includes += "path/to/include2"; 
... 
incPath = "path/to/include_all.jade"; 

fs.open(incPath,'w',function(err,fd){ 
if(err){ 
    throw 'error open file: ' + incPath +" "+ err; 
} 

var buffer = new Buffer(includes); 
fs.write(fd,buffer,0,buffer.length,null,function(err){ 
    if (err) 
     throw 'error writing file: ' +err; 
    fs.close(fd,function(){ 
     console.log('file written ' + incPath); 
    }); 
}); 
}); 

당신의 app.js에 는

include path/to/include_all.jade 
관련 문제