10

我正在尝试为 Meteor 应用程序构建一个智能包,它根据智能包的特性提供一些监控功能和其他工具。有关更多详细信息,请阅读此问题

无论如何,我试图找出为这个包创建一个管理界面的最佳方法,它当然会在 Meteor 中运行。理想情况下,我想要类似于observatory的东西,除了在包可以控制的站点的单独部分(甚至在不同的端口上)。

天文台的人解决这个问题的方式非常巧妙——他们只是在应用程序主页面上有一个弹出 div 来提供必要的信息。这很好,但在我看来,这不是在应用程序上显示界面的最佳方式。使用路由的问题在于,每个人都使用的流行Meteor 路由器不支持超过一个“堆栈”页面,并且已经开发的更好的 Meteor 路由器(例如由 Chris Mather 在Devshop 5中)尚未发布然而。

任何人都可以提出解决这个问题的好方法吗?理想情况下,我的包只能在网站的单独部分呈现自己的管理模板,例如/admin.

4

6 回答 6

3

正如 James Hatfield 所指出的,Iron-Router 现在支持多种布局。对于现在遇到这个问题的人来说,这是处理多布局场景的最佳方式。

Router.map ->
  @route 'home',
    layoutTemplate: 'homeLayout'
    path: '/'

  @route 'dashboard',
    layoutTemplate: 'dashboardLayout'
于 2013-12-05T20:27:56.997 回答
1

请看一下我在 github 上的项目。我有一个解决方案。它可能不是最好的,但到目前为止它正在工作。

github.com/voteapp

<head>
    <title>Index</title>
</head>

<body>
    {{> root}}
</body>

根模板在里面使用了一些其他的模板。我可能会使用 2 个不同的索引文件。1 个用于站点,1 个用于管理面板。

根模板:

<template name="root">
    {{#if adminURL}}
        {{> adminLogin}}
    {{else}}
        {{> site}}
    {{/if}}
</template>

admin登录模板:

<template name="adminLogin">
    {{#if currentUser}}
        {{> management}}
    {{else}}
        admin login page.
            <div style="float: right">
              {{loginButtons align="right"}}
            </div>
    {{/if}}
</template>

管理模板:

<template name="management">
    <div id="header" class="navbar">
       ....
    </div>
    <div id="container" class="row-fluid">
       ....
    </div>

    <link rel="stylesheet" href="/css/admin.css">
</template>

网站模板:

<template name="site">
     <h1>Hello World!</h1>

     <link rel="stylesheet" href="/css/site.css">
</template>

这实际上不是我项目中的 html,但它是这样的。这样,CSS 链接将出现在 body 标签的末尾。并且对于管理面板和站点本身将具有不同的 html 结构和 css 文件。此外,您可能还想添加 javasctipt 文件。

于 2013-09-12T14:21:53.020 回答
1

IronRouter 支持多种布局。

https://github.com/EventedMind/iron-router

Router.configure({
  layout: 'layout',
  notFoundTemplate: 'notFound',

  loadingTemplate: 'loading',

  renderTemplates: { 
    /* render the templated named footer to the 'footer' yield */
    'footer': { to: 'footer' },

    /* render the template named sidebar to the 'sidebar' yield */
    'header': { to: 'header' }
  }
});

Router.map(function() { 

  this.route('admin', {
    layout: 'admin_layout',
    path: '/admin',
    template: 'admin',
    data: function() {
      return { page : 'admin'}
    },
    onBeforeRun: checkLoggedIn,
    renderTemplates: { 
    /* render the template named footer to the 'footer' yield */
    'admin_footer': {to: 'footer'},

    /* render the template named sidebar to the 'sidebar' yield */
    'admin_login_header': {to: 'header'}
    }
  });

this.route('home', {
    path: '/',
    template: 'home',
    data: function() {
      return { page : 'home'}
    }
  });


<template name="layout">
//this is where your standard view layout goes

</template>

<template name="admin_layout">
//this is where your admin view layout goes

</template>

如果您将它与 Meteor 帐户 UserID 检查和 onBeforeRun 挂钩匹配,则可以很好地工作。我还没有完全测试安全方面,但看起来它会起作用。

于 2013-08-29T03:50:36.570 回答
0

您好,感谢您参考天文台!你完全正确,最终单独进行管理和监控会很好,事实上我们最近一直在朝着这个方向努力,这也将是一个主要方向 - 目标是监控、分析日志并在云端提供一些管理能力。它已经具有一些基本功能 - 在这里查看:http: //vega.observatoryjs.com/demo

顺便说一句,我们在原始天文台中处理您的问题的方式 - 只需在 Pages 或 Iron Router 等中创建一个单独的路线,然后将天文台(或您的管理面板)模板放在那里 - 在我们的例子中是 {{>logs_bootstrap}}。这样,它将与主应用程序完全分开。但是云更好:)

于 2013-09-12T17:44:36.730 回答
-1

这不是通过简单地使用 Meteor 路由器和模板助手来实现的吗:

指定您的路线:

Meteor.Router.add({
    '/foo'  : 'foo',
    '/admin': 'admin'
});

假设您有一个 3 列布局。像这样创建您的模板:

<template name="body">
  <div class="container">
    <div class="span"4>
      {{renderPage LeftLayoutName}}
    </div>
    <div class="span"4>
      {{renderPage MiddleLayoutName}}
    </div>
    <div class="span"4>
      {{renderPage RightLayoutName}}
    </div>
  </div>      
</template>

然后指定您的模板助手:

Template.body.helpers({
  LeftLayoutName: function() {
    switch (Meteor.Router.page()) {
      case 'foo':
        return 'foo_left';
      case 'admin':
        return 'admin_left';
    }
  },
  MiddleLayoutName: function() {
    switch (Meteor.Router.page()) {
      case 'foo':
        return 'foo_middle';
      case 'admin':
        return 'admin_middle';
    }
  },
  RightLayoutName: function() {
    switch (Meteor.Router.page()) {
      case 'foo':
        return 'foo_right';
      case 'admin':
        return 'admin_right';
    }
  }
});
于 2013-07-25T08:11:54.167 回答
-1

我有一个类似的问题。在路由器流星包示例中没有那么笨重的示例。

https://github.com/tmeasday/meteor-router/tree/master/examples/app-with-layout

希望这可以帮助。

于 2013-08-20T05:45:02.463 回答