Javascript Ember.js v2路由器中的多个插座

Javascript Ember.js v2路由器中的多个插座,javascript,ember.js,Javascript,Ember.js,我刚刚开始使用Ember.js,一个似乎很有希望的想法是多个门店将多个模板混合在一起,以生成复杂但模块化的布局 但是我不能让它工作。几个月前(2012年年中),似乎有很多关于这方面的问题、答案和例子,但在3月到1.0的时候,他们最近(2012年12月/2013年1月)将路由器改写为“v2”API。这些文档在描述内容方面做得很好,但省略了很多重要的上下文,我还没有找到一个端到端的示例 以下是我读到的: 下的所有内容(最新,但不详尽) (这可能已过时?我每次尝试调用controller.conne

我刚刚开始使用Ember.js,一个似乎很有希望的想法是多个门店将多个模板混合在一起,以生成复杂但模块化的布局

但是我不能让它工作。几个月前(2012年年中),似乎有很多关于这方面的问题、答案和例子,但在3月到1.0的时候,他们最近(2012年12月/2013年1月)将路由器改写为“v2”API。这些文档在描述内容方面做得很好,但省略了很多重要的上下文,我还没有找到一个端到端的示例

以下是我读到的:

  • 下的所有内容(最新,但不详尽)
  • (这可能已过时?我每次尝试调用
    controller.connectOutlet()
    都失败,出现
    未捕获的类型错误:对象没有方法“connectOutlet”
  • 发布。特别是最下面的几条评论(多个出口的问答)。是的,该要点标记为“警告;过时;有关最新信息,请参阅路线指南”。但是当前的路由指南似乎没有完全描述该行为。指南的这一部分显示了如何渲染到已经存在的不同插座(我可以让它工作),但我无法确定如何连接其他插座或实例化其他模板
什么对我有用:

  • 设置嵌套管线(嵌套资源;不能嵌套管线;但可以自定义嵌套资源的管线),以及根据管线自动实例化的嵌套模板和插座
我还没有弄清楚如何完成:

  • 手动实例化模板并将其连接到插座。如果您希望使用多个插座,或者希望插座/模板关系的结构与路线不同,则这似乎是必要的。(下面将有一个例子。基本上,我正在尝试使用一个模板作为mixin,我可以将其嵌入任何我想要的地方。)
对我来说似乎有希望但失败的事情是

  • 覆盖路由的控制器(使用
    App.WhateverRoute=Ember.route.extend()
    ,提供我自己的
    setupController
    方法扩展路由),并在此处调用
    controller.connectOutlet
    。如上所述,此操作失败;传递到此方法中的控制器对象没有
    connectOutlet
    方法
示例(,或以下为一个自包含的html文档,其中嵌入CSS和脚本,并从https链接加载余烬和依赖项,因此,如果您想尝试,您应该能够将其保存到本地文件并在浏览器中打开):


Ember.js路由器示例
.出口{
边框:1px纯黑;
填充物:5px;
}
根索引模板。您不应该看到这一点,因为我们将App.IndexRoute重定向到其他位置

关于这个演示

本演示的指南

动物。您已选择:

{{outlet}} 未选择任何动物

猫。我会喵喵叫。像所有的动物一样,我会 {{outlet}}

狗。我会叫。像所有的动物一样,我会叫 {{outlet}}

我还活着

选择“我的出口”的内容: {{{#链接到“索引”}/(根){{/linkTo}} {{{#linkTo“about”}/about{{/linkTo} {{{linkTo“guide”}/guide{{/linkTo} {{{链接到“动物”}/动物{{/链接到} {{{链接到“动物.猫”}/动物/猫{{/链接到} {{{链接到“动物.狗”}/动物/狗{{/链接到}

{{outlet}} App=Ember.Application.create(); App.Router.map(函数(){ 本资源(“关于”); 本文件。资源(“指南”); 这个。资源(“动物”,功能(){ 这条路线(“猫”); 这条路线(“狗”); }) }); App.IndexRoute=Ember.Route.extend({ 重定向:函数(){ 这个。过渡到('about'); } }); App.animalindexroute=Ember.Route.extend({ 重定向:函数(){ 这个。过渡到(‘动物。猫’); } }); App.AnimalsCatsRoute=Ember.Route.extend({ 设置控制器:功能(控制器、型号){ //错误:此控制器对象没有connectOutlet方法 //(取消注释以自己查看此内容) //控制器。连接插座(“动物混合器”); } }); App.initialize();

本质上,animal_mixin是一块样板文件,我想作为一个mixin重复使用,通过在那里放置一个插座并将其连接到这个模板,将其放到任何地方。我意识到这个示例是人为的,因为我可以通过“继承”来实现由筑巢结构提供:动物_-mixin的含量可以直接进入“动物”体内模板,我不需要在动物/猫和动物/狗中提到它。如果我想在所有动物中使用它,那就好了,但假设我有另一个/animals子例程,我不想包含这个片段。同样,这个例子是人为的,但我希望问题和意图是明确的。

您可以使用多个命名的输出。这里是一个JSFIDLE示例:


哦,哇。你可以在同一个renderTemplate()处理程序中多次调用此.render()。回想起来似乎很明显,但我没有想到。谢谢。你能澄清一下何时呈现dom for outlet标头吗?是否每次切换帖子时都会重新渲染它?另外,你需要调用此.render('header')吗在每一条路线的renderTemplate?您好,只有在特别重写的情况下,才会重新呈现指定的出口。一般来说,您应该靠近co
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Ember.js Router Example</title>
    <style>
      .outlet {
        border: 1px solid black;
        padding: 5px;
      }
    </style>
  </head>

  <body>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
    <script src="https://raw.github.com/wycats/handlebars.js/1.0.rc.2/dist/handlebars.js"></script>
    <script src="https://raw.github.com/emberjs/ember.js/release-builds/ember-1.0.0-pre.4.js"></script>


    <script type="text/x-handlebars" data-template-name="index">
      <p>Root index template. You should not see this because we redirect App.IndexRoute elsewhere.</p>
    </script>

    <script type="text/x-handlebars" data-template-name="about">
      <p>About this demo.</p>
    </script>

    <script type="text/x-handlebars" data-template-name="guide">
      <p>Guide to this demo.</p>
    </script>

   <script type="text/x-handlebars" data-template-name="animals">
      <p>Animals. You have selected:</p>
      <div class='outlet'>{{ outlet }}</div>
    </script>

    <script type="text/x-handlebars" data-template-name="animals/index">
      <!-- you will not see this unless you disable App.AnimalsIndexRoute redirect. -->
      <p>No animal selected.</p>
    </script>

    <script type="text/x-handlebars" data-template-name="animals/cats">
      <p>Cat. I can meow. Like all animals, I
        <span class='outlet'>{{ outlet }}</span>
      </p>
    </script>

    <script type="text/x-handlebars" data-template-name="animals/dogs">
      <p>Dog. I can bark. Like all animals, I
        <span class='outlet'>{{ outlet }}</span>
      </p>
    </script>

    <script type="text/x-handlebars" data-template-name="animal_mixin">
      <p>am alive.</p>
    </script>

    <script type="text/x-handlebars" data-template-name="application">
      <div class="container">
        <p>
          Select contents for my outlet:
          {{#linkTo "index"}}/ (root){{/linkTo}}
          {{#linkTo "about"}}/about{{/linkTo}}
          {{#linkTo "guide"}}/guide{{/linkTo}}
          {{#linkTo "animals"}}/animals{{/linkTo}}
          {{#linkTo "animals.cats"}}/animals/cats{{/linkTo}}
          {{#linkTo "animals.dogs"}}/animals/dogs{{/linkTo}}
        </p>

        <div class='outlet'>
          {{ outlet }}
        </div>
      </div>
    </script>

    <script>
      App = Ember.Application.create();
      App.Router.map(function() {
        this.resource("about");
        this.resource("guide");
        this.resource("animals", function() {
          this.route("cats");
          this.route("dogs");
        })
      });
      App.IndexRoute = Ember.Route.extend({
        redirect: function() {
          this.transitionTo('about');
        }
      });
      App.AnimalsIndexRoute = Ember.Route.extend({
        redirect: function() {
          this.transitionTo('animals.cats');
        }
      });
      App.AnimalsCatsRoute = Ember.Route.extend({
        setupController: function(controller, model) {
          // BUG: this controller object has no connectOutlet method
          // (uncomment to see this yourself)
          // controller.connectOutlet('animal_mixin');
        }
      });
      App.initialize();
    </script>

</html>
<script type="text/x-handlebars" data-template-name="application">
    {{outlet header}}
    {{outlet body}}
    {{outlet navBar}}
</script>
events: {
    showModal: function(){
        this.render('modal', {
            into: 'index',
            outlet: 'modalOutlet',
            controller: this.controllerFor('modal')
        }); 
    }
}