2017-08-22 37 views
1

據我所知,帕格不支持動態包括或擴展模板。即解決方案動態包括帕格/玉

extend path/to/template 

的作品,但不

extend #{dynamic_path_to_template} 

有一種解決方法(但令人費解的),將允許修改

語境在運行時使用的視圖模板相同的目標:我的用例是我正在開發一個npm模塊,並且用於擴展其他視圖的模板位於模塊內部。在模塊發佈和安裝之後,路徑將被定義(即node_modules/my_module/path/to/template),但在開發階段,我需要能夠「npm link」到模塊並擁有模板工作。我也不想硬編碼鏈接,所以我可以發佈相同的代碼作爲測試。

回答

0

現在沒有辦法做到這一點,但是你可以在沒有動態擴展的情況下制定出你的應用架構。

可能的解決方法#1

  1. 做一個layout.jade有條件地包括多個佈局:

    layout.jade: 
    
    if conditionalVariable 
        include firstLayout.jade 
    else 
        include otherLayout 
    
  2. 在視圖,延伸layout.jade,並在控制器限定conditionalVariabletrue/false):

    view.jade: 
    
    extends layout 
    
    block content 
        p here goes my content! 
    

可能的解決方法#2

  1. 通配置,以佈局

    - var lang = req.getLocale(); 
    doctype html 
        block modifyLayout 
    
  2. 拆分項目分成多個入口,每個入口延伸的佈局,並傳遞其不同CONFIGS,並且包括不同的東西在不同的區塊

    extends ../layout 
    block modifyLayout 
        - var lang = "en" //force language to be en in this page. 
    block body 
        include my-page-body 
    

可能的解決方案#3

使用類似terraform它採用哈巴狗作爲它的渲染引擎,但它使您可以使用動態諧音這樣

!= partial(dynamicFileFromVariable) 
+0

解決方案#1和#2的外觀良好,除了它們需要了解可能的模板文件的位置。我的用例是我正在開發一個npm模塊,模板在模塊內部。在模塊發佈和安裝之後,路徑將被定義(即node_modules/my_module/path/to/template),但在開發階段,我需要能夠「npm link」到模塊並擁有模板工作。我也不想硬編碼鏈接,所以我可以發佈相同的代碼作爲測試。 – takinola

+0

在運行帕格渲染器之前,可以使用環境知道其位置的動態路徑向文件系統寫入帕格文件。 – Bamieh

+0

這是如何工作的?你建議做一些像「fs.writeFile(/ known/location/my_template。帕格)「在初始化序列中,然後使用新創建的帕格文件模板來擴展我的視圖?如果是這樣,我認爲帕格要求所有文件在運行時立即可用,因爲所有文件都被加載到內存中。 – takinola