在ember.js中使用参数将视图组件渲染到指定出口

7
我在我的应用程序模板中有两个命名的出口,slider-areapre-footer。是否有一种方法可以将需要传递参数的视图组件(如index模板中显示的main-slider组件)传递到命名出口?因此,我需要将{{main-slider sliders=filteredSlider}}传递到index模板中的出口{{outlet "slider-area"}}
我来自rails,所以如果这不是ember的工作方式,请原谅我的想法。您可以在应用程序模板中指定yield :slider_area,然后在content_for :slider_area块中包装此区域的任何内容。在ember中是否有类似的方法?
index.html
<script type="text/x-handlebars" data-template-name="application">
  {{panasonic-topbar}}
    <div id="batterywrap">
      {{outlet "slider-area"}}
        <div class="index_contents">
          <div class="index_contents_inner">
        <div class="main_area">
          {{outlet}}
        </div>
          </div>
       </div>
     </div>
  {{panasonic-footer}}
</script>

<script type="text/x-handlebars" data-template-name="index">
  # Something like {{outlet "slider-area" render main-slider sliders="filteredSlider}} ?
  {{main-slider sliders=filteredSlider}}
  {{partial "social_footer"}}
</script>

app.js

App.IndexController = Ember.ObjectController.extend({
    filteredSlider: function(){
      return this.get('sliders').filterBy('page', 'index');
    }.property('sliders.@each.page')
});

App.IndexRoute = Ember.Route.extend({
    model: function() {
      return Ember.RSVP.hash({ 
        sliders: this.store.find("slider")
      });
    }
});
1个回答

5

好的,我有一个解决方案来解决这个问题,而不是尝试将视图组件传递到特定插槽中(ruby on rails 的方式)。关键是创建一个模板而不是组件,并从Route中呈现此模板到指定的插槽。

当从Route中呈现时,滑块模板可以访问路由控制器作用域中的所有函数,因此我们在将使用此模板的所有控制器上统一命名空间函数/参数,以便我们的动态参数正常工作。

因此,在IndexRoute中,我们定义要发送到控制器的数据sliders,还指定我们要在默认插槽中呈现常规内容使用this.render();,然后我们将共享的滑块模板呈现到命名插槽"slider-area"中。然后在我们的控制器中,我们将模型数据过滤为我们的规格,并将此函数命名为batterySliders,以供使用此功能的所有控制器使用。

app.js

App.IndexController = Ember.ObjectController.extend({
    batterySliders: function(){
        return this.get('sliders').filterBy('page', 'index');
    }.property('sliders.@each.page')
});

App.IndexRoute = Ember.Route.extend({
    model: function() {
        return Ember.RSVP.hash({ 
            sliders: this.store.find("slider"),
        });
    },
    renderTemplate: function(){
        this.render();
        this.render("slider", {outlet: "slider-area"});
    }
});

index.html

<script type="text/x-handlebars" data-template-name="slider">
        {{panasonic-navigation tagName="div" classNames="gnavi_area"}}
        <div class="slider_wrap">
            <div id="slider" class="main_slider">
            {{#each slider in batterySliders}}
                <div class="slider_area slider0{{unbound slider.id}} {{unbound slider.background}}">
                    <div class="slider_inner">
                        <div class="inner0{{unbound slider.id}}">
                            <img {{bind-attr src="slider.image" alt="slider.image"}} class="nosp"/>
                            <img {{bind-attr src="slider.sm_image" alt="slider.sm_image"}} class="sp"/> 
                        </div>
                    </div>
                </div>  
            {{/each}}               
            </div>
        </div>
    </script>

application.html

<script type="text/x-handlebars" data-template-name="application">
    {{panasonic-topbar}}
    <div id="batterywrap">
        <div class="content_head">
            {{outlet "slider-area"}}
        </div>  
        <div class="index_contents">
            <div class="index_contents_inner">
                <div class="main_area">
                    {{outlet}}
                </div>
            </div>
        </div>
    </div>
    {{panasonic-footer}}
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接