将带有参数的视图组件渲染到命名的插件ember.js中

时间:2014-02-10 16:57:54

标签: javascript jquery ember.js ember-data

我的应用模板slider-areapre-footer中有2个指定的插座。有没有办法将带有参数的视图组件(如索引模板中显示的main-slider组件)传递给指定的插座?所以我需要将{{main-slider sliders=filteredSlider}}传递到索引模板中的插座{{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 个答案:

答案 0 :(得分:4)

好的,所以我有一个解决这个问题的方法,而不是试图将模板中的视图组件传递给特定的插座(rails上的ruby),关键是要创建一个模板,而不是一个组件,从路线内到特定的出口渲染。

从Route渲染时,滑块模板可以访问Routes控制器范围内的所有函数,因此我们将在所有将使用此模板的控制器中对函数/参数进行命名,并且我们的动态参数应该有效。 / p>

下面在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>