【问题标题】:Override application.hbs template in Emberjs在 Emberjs 中覆盖 application.hbs 模板
【发布时间】:2018-11-28 16:50:58
【问题描述】:

在 emberjs 中,我的应用程序已经有使用 application.hbs 模板的路由模板,但现在我想创建一个不使用 application.hbs 的新路由模板。

有什么简单的解决办法吗?

我看到了很多答案,但这与我的规范不符,而且我的 ember 版本是 2.11。

谢谢。

【问题讨论】:

  • application.hbs 是根模板。如果您不想使用它,则需要重组您的路线。可以将当前在 application.hbs 中的内容提取到 application/index.hbs
  • 如果这是由于想要不同的布局,spin.atomicobject.com/2016/05/03/reusable-page-layouts-ember 我会将变量显示移动到子路线

标签: templates ember.js routes overriding


【解决方案1】:

尽可能让 application.hbs 在所有路由中保持最小和通用。您应该做的是为您的应用程序生成顶级路由。

假设您有一个通用设置,其中有一个经过身份验证的部分、登录后和登录部分。登录前和登录后具有不同的顶级模板是很常见的。试试这样的:

ember g 路由登录 ember g 路由登录/索引 ember g 路由登录/忘记密码 ember g 路由已通过身份验证 ember g 路由认证/索引 ember g 路由已验证/配置文件 等等……

您的 login.hbs 将具有自己的样式,并且可能具有子路由,它们将采用该样式并将后续嵌套模板放置在其他人提到的 {{outlet}} 中。

文件结构:

routes/
-login/
----index.hbs
----forgot-password.hbs
-authenticated/
----index.hbs
----profile.hbs
login.hbs
authenticated.hbs
application.hbs

在上面的示例中,login.hbs 可能如下所示:

{{yellow-navbar}}
{{outlet}}

和这样的authenticated.hbs:

{{pink-navbar}}
{{user.name}}
{{outlet}}

现在,login/index.hbs 和 login/forgot-password.hbs 模板将在 login.hbs 出口中呈现。这两个页面都会呈现一个黄色的导航栏,然后是它们自己的内容。

因为 authenticated.hbs 是另一个顶级父路由,authenticated/index.hbs 和 authenticated/profile.hbs 都会在粉红色的导航栏下方呈现它们的内容并显示当前用户的姓名。

如果您的 application.hbs 看起来像这样:

{{#general-site-container}}
  <h2>Website Name</h2>
  {{outlet}}
{{/general-site-container}}

那么所有的路由,无论是认证的还是登录的,都将在 general-site-container 中,并且都将显示带有网站名称的 h2。

这里有一个重要的提示,我看到很多人对此感到困惑,那就是这个文件夹结构并不决定路由的实际路径。

路由器可以这样配置,以避免在 url 中显示“authenticated”: Router.js

  // login.index route assumed at root url /login
  this.route('login', { path: '/login' }, function() {
    // avail at /login/forgot-password
    this.route('forgot-password', { path: '/forgot-password' }
  });

  //authenticated.index.hbs assumed at root avail at /
  //notice that the authenticated parent route has a route of "/"
  this.route('authenticated', { path: '/' }, function() { 

    // authenticated.profile route avail at /profile
    this.route('profile', { path: '/profile' });

    // as an exmaple you can further nest content to your desire
    // if for instance your profile personal info section has a parent 
    // template/route
    this.route('', { path: '/personal-info' }, function() {
      this.route('address', { path: '/address' }); //profile/personal-info/address
    });
  });

【讨论】:

    【解决方案2】:

    我认为您需要使用{{outlet}} 来实现此目的。 通过覆盖应用程序模板创建不同的出口,您需要在其中显示不同的模板

    {{outlet}} //application hbs default one
    
    {{outlet "view1"}} // another template
    
    {{outlet "view2"}} //another template
    

    应该有view1.hbsview2.hbs 以呈现这些模板

    【讨论】:

    • 事实上,每当我创建两个视图时,例如本例中的 view1.hbs 和 view2.hbs,那么这些视图将已经使用 application.hbs 模板。我的问题是,如果我创建一个新的路由模板,如何覆盖 application.hbs。
    • 您可以做的是在 application.hbs 中渲染 {{outlet}}。保留 application.hbs 只是为了 renderOutlets 不会将您在 application.hbs 中的内容移动到可以通过 application.hbs 渲染的子模板中,因此要渲染的逻辑以及如何渲染应该在应用程序控制器中。据此它将渲染Outlet。
    • 假设您需要根据不同模板的用户级别渲染页面,您可以在应用程序控制器中设置逻辑来检查 currentUser 访问级别并相应地渲染模板 - 保持 application.hbs 干净
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2019-03-27
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多