【问题标题】:Nesting templates in Ember.jsEmber.js 中的嵌套模板
【发布时间】:2013-04-02 14:47:58
【问题描述】:

尝试遵循 this 示例(现在已将 ember 更新到 1.0rc2),我想嵌套模板以开始使用。我在home 模板中有第一个额外的{{outlet}},我希望它包含两个嵌套视图(一个“简历”span9 和另一个“工具表”span3 供引导爱好者使用)。 “简历”将再次具有嵌套模板,但一旦我能通过第一级,我想我可以。

根据this SO?和我编辑的JS Fiddle answer,我有点明白它是如何完成的,但是答案在coffeescript中,示例中的路由器比我能理解的要复杂一些(使用connectOutlets,给出了它的一些辅助方法,我自己有点理解。

最终结果应该类似于this fiddle

但是,由于sections 路由器和items 路由器位于不同的路径上,我如何让其他模板在家庭路由器中呈现,但是,这些将成为索引路由/ 的一部分?我需要多个{{outlets}}吗?如何将适当的模板路由到适当的插座占位符?

信息:

DEBUG: ------------------------------- 
DEBUG: Ember.VERSION : 1.0.0-rc.2 
DEBUG: Handlebars.VERSION : 1.0.0-rc.3 
DEBUG: jQuery.VERSION : 1.9.1 
DEBUG: ------------------------------- 

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Resume Builder</title>
    <meta name="description" content="A way to create a tailored resume from my CV" />
    <meta name="author" content="Chris Frisina" />

    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <link href="css/bootstrap.min.css" rel="stylesheet" />
    <style>
      body {
        padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
      }
    </style>
    <link href="css/bootstrap-responsive.css" rel="stylesheet" />
    <link href="css/RB.css" rel="stylesheet" />
  </head>

  <body>

    <script src="js/libs/jquery-1.7.1.js"></script>
    <script src="js/libs/jquery.lorem.js"></script>
    <script src="js/libs/bootstrap.min.js"></script>
    <script src="js/libs/handlebars-1.0.0.beta.6.js"></script>
    <!-- // <script src="js/libs/ember1.js"></script> -->
    <script src="js/libs/ember2.js"></script>
    <script src="js/RB.js"></script>

    <script type="text/x-handlebars" data-template-name="application">
      <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="navbar-inner">
          <div class="container-fluid">
            <div class="brand home" {{bindAttr class="isHome:active"}} {{action "doHome"}}>Chris Frisina</div>
            <div class="nav-collapse pull-right">
              <ul class="nav">
                <li class="sections"><a>1</a></li>
                <li class="sections"><a>2</a></li>
              </ul>
            </div>
          </div>
        </div>
      </div>

      <div class="container-fluid">
        {{outlet}}
      </div>
    </script>

    <script type="text/x-handlebars" data-template-name="index">
      <h3 class="demo-panel-title">This is the index template</h3>
      {{home}}
    </script>

    <script type="text/x-handlebars" data-template-name="home">
      <div class="row-fluid">
        <!-- This is where I resume template should be placed -->
        {{resume}}
        <!-- This is where I tooltable template should be placed -->
        {{tooltable}}
      </div>
    </script>

    <script type="text/x-handlebars" data-template-name="resume">
      <div class="span9">
        <h1>Viewer</h1>
      </div>
    </script>

    <script type="text/x-handlebars" data-template-name="tooltable">
      <div class="span3">
        <div id="tooltable" class="tooltable hero-unit affix">
          <h1>Tooltable</h1>
          <p>Selector 1</p>
          <p>Selector 1</p>
        </div>
      </div>
    </script>

  </body>
</html>

app.js:

// Attach the application to window
window.RB = Ember.Application.create({});

// Define the main application controller. This is automatically picked up by
// the application and initialized.
RB.ApplicationController = Ember.Controller.extend({

});
RB.ApplicationView = Ember.View.extend({
  templateName: 'application'
});

// Router
RB.Router = Ember.Router.extend({

});
RB.Router.map(function(){

});

// Home
RB.HomeController = Ember.Controller.extend({
});
RB.HomeView = Ember.View.extend({
  templateName: 'home',
});
// Resume
RB.ResumeController = Ember.ObjectController.extend({
});
RB.ResumeView = Ember.View.extend({
  templateName: 'resume'
});

// Tooltable
RB.TooltableController = Ember.ObjectController.extend({
});
RB.TooltableView = Ember.View.extend({
  templateName: 'tooltable'
});

//Defer the start until advanceReadiness() is complete
// cant init RB manually, must use advanceReadiness(), which needs defer...
RB.deferReadiness();
// var test = function() {
  RB.advanceReadiness();
// });

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    我无法回答整个问题,但我可以先给出一个示例,说明如何嵌套模板并编写使用它们的路由

    App.Router.map(function(match) {
        this.resource("days", { path: "/days" }, function() {
            this.resource("day", { path: "/:day_id" }, function() {
                this.resource("appointments", { path: "/appointments" }, function() {
                    this.resource("appointment", { path: "/:appointment_id" }, function() {
                        this.route("edit", { path: "/edit" });
                    });
                });
            });
        });
    });
    

    对于上面的示例路线,我计划让用户从 /days 点击到特定的一天 /days/1

    然后在那一天内我希望他们能够显示所有约会

    然后在约会中,我想让他们能够“点击”特定的 apt 并显示或编辑它

    因为我的应用程序以天数路线开始,所以在我的应用程序索引中,我想在应用程序启动时立即跳转到天数(例如,我的应用程序从 /days 开始而不是从 /days 开始)

    App.IndexRoute = Ember.Route.extend({
        redirect: function() {
            this.transitionTo('days');
        }
    });
    

    模板如下所示

    application.handlebars(或者如果你内联它)

    {{outlet}}
    

    days.handlebars

    {{#each day in controller}}
      {{#linkTo 'day' day}}view details about the day{{/linkTo}}
    {{/each}}
    
    {{outlet}}
    

    day.handlebars

    {{#linkTo "appointments" target="controller"}}show all the apts{{/linkTo}}
    

    appointments.handlebars

    {{#each appointment in controller}}
    <a href="#" {{action 'addAppointment' appointment target="view"}}>{{appointment.start}} - {{appointment.end}}</a><br />
    {{/each}}
    

    我的约会路线如下所示(在上述模板中提供约会)

    App.AppointmentsIndexRoute = Ember.Route.extend({
        model: function(params) {
            var day = this.modelFor("day");
            return day.get('appointments');
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 2012-12-20
      • 2014-07-17
      相关资源
      最近更新 更多