2017-08-22 34 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