【问题标题】:Automatically provide data to Express partial views自动向 Express 部分视图提供数据
【发布时间】:2016-06-07 08:01:05
【问题描述】:

我正在编写一个Express 4 应用程序,目前我使用twig.js 作为视图引擎,因为我觉得它很舒服,尽管我可能会被说服更改这个引擎。

我已经使用 PHP/Laravel 进行了很多开发,并且已经习惯了在那个阵营中他们称之为 view composers 的东西。使用这些,我可以为特定视图编写一个作曲家,无论是主页视图、其他视图扩展的布局,还是其他视图包含的部分。作曲家执行任何必要的逻辑来准备视图所需的任何数据,然后将其附加到视图的上下文中,以便在渲染期间可用。

例如,我可能有一个显示当前用户状态的部分,所以如果他们已注销,它可能只有一个登录按钮,如果他们已登录,它将有他们的图标,用户名,以及让他们注销的菜单等。相应的作曲家将检查用户是否已登录,如果已登录,则将有关用户的相关数据附加到视图的上下文中。然后,哪个页面包含此部分并不重要;数据将始终可用,而我不必记住将特定数据添加到传递给页面主视图的上下文中。

Express 中是否有等价物?还是取决于我使用的模板引擎?

【问题讨论】:

    标签: node.js express partials


    【解决方案1】:

    目前,使用res.render() 呈现的视图需要在每个res.render() 上传递其数据。如果视图使用需要某些数据点的部分模板,则使用该模板的视图将需要通过res.render() 传递该值。所以简而言之,无论可能共享的部分模板是否需要数据点,您总是需要传递数据。使用视图引擎时,不会自动向视图提供任何内容。

    【讨论】:

    • 您是否同意这在某些情况下看起来很尴尬,就像我在问题中概述的那样?我想知道是否有更好的方法来做到这一点。
    • @tremby 大部分使用 Express 构建的网站/应用程序使用其他一些框架来提供数据绑定,例如 React 或 Angular(即 MEAN Stack)。
    • 这并不完全正确。您可以使用response localsapplication locals。我总是在我的快速应用程序中包含以下中间件:function(req, res, next){ res.locals.req = req; next(); }
    【解决方案2】:

    您是否询问是否有可能拥有一些视图 A,其中包括部分 P_A 并能够将一些数据传递给不依赖于路由的部分,即无论您在站点/应用程序上的任何位置,您的部分都有数据绑定到它(完全独立于 route / url 和 view )您可以用于您的登录状态吗?

    如果是这样,那么创建您的部分,让我们使用导航/菜单部分: 请注意,此示例使用 ejs 进行模板化

    <nav>
        <ul>
        <!-- pass the data upon call / include-->
        <% for(var i = 0, len=navigation.length;i < len;i++) {%>
            <li><a href="<%=navigation[i].href%>"><%=navigation[i].Text%></a></li>
        <%}%>
        </ul>
    </nav>
    

    调用/在视图中包含您的空间

    view.ejs

    <%- include('nav', { navigation : [{Text : 'Items' ,href : '/' },{Text : 'People' ,href : '/names' }] } )%>
    

    【讨论】:

    • 我不清楚。它似乎没有回答这个问题,但我可能会误解它。我要求以某种方式使特定数据(生成可能涉及数据库查找和诸如此类的事情)可用于特定的局部视图,无论何时何地包含该局部视图。看起来您只是在展示如何将一些数据从父视图传递到局部视图。请澄清我是否遗漏了什么。
    • 嗨,我想演示的是,我可能是那个有误解的人,如果你有一个导航作为一个菜单的例子,并说你正在拉它的数据从数据库中,您可以有一个导航部分,如我的回答中所示,并且已经在其中执行了逻辑,然后将部分包含在实际视图中,您可以根据需要从数据库中传递数据。导航 json 对象只是一个示例,例如您的 db 对象。还在纠结?
    • 哦,你是说在局部视图的代码中嵌入应用逻辑?
    • 当然,这也取决于您喜欢在应用程序中组织/分离事物的方式...您确实可以选择在控制器中编写逻辑并在部分中调用它。 .但是如果在实现您想要的代码量方面没有发生太多事情,您确实可以在部分中编写逻辑,在我的示例中,实际上没有逻辑,而只是一个循环,这可能是也和你一样。
    • 一些代码 sn-p 更接近你所需要的:'loginStatusPartial'部分:
      / /to do with login users
      //to do with loggedin users
      'View' code -其中 partial 将被调用/包含: 抱歉,您可能需要提取此注释并更清晰地查看代码的外观。
    【解决方案3】:

    据我所知,expressjs 中没有类似的东西。

    【讨论】:

    • 那么在这种情况下你会怎么做呢?在一大堆路由操作文件中附加相同的数据,因为它被用于这么多页面?
    • 取决于用例。例如,如果使用 Passport 处理身份验证,则会将 user 属性添加到请求对象,这在视图呈现的上下文中可用。如果特定于路径(例如,与客户端相关的所有页面,URL 上的客户端 ID 为 /:clientID/some-stuff)我建议使用 route parameters 女巫可用于视图渲染的上下文和其他情况路由中间件可能是一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多