Ember.js:访问" parent"使用{{render}}助手时的控制器

时间:2014-05-01 06:31:14

标签: ember.js

我有以下设置:

| // IndexController contains array of search result objects
| IndexController  (ArrayController) 
|     //Contains a search result object with row data (array) and search metadata
|---> ResultController (ObjectController) 
|          // Contains just the row data which is rendered into a sortable table 
|--------> TableController (ArrayController)

IndexController在用户启动搜索时从服务器检索对象列表。返回的每个对象都有一些关于搜索的元数据以及所有行数据。

使用索引模板中的{{#each}}帮助程序呈现每个对象:

{{#each itemController="result"}}
    {{view App.ResultView}}
{{/each}}

ResultView呈现元数据,然后使用{{render}}帮助器呈现实际表格,如下所示:

<h2>{{pieceofMetaData}}</h2>
{{render "table" rows}}  

由于我指定了模型(在本例中为行数据),{{render}}助手为每个结果对象创建了TableController的实例。例如,如果IndexController模型中有3个结果对象,则会创建3个TableControllers。 TableController是一个ArrayController,可以利用ArrayController可以为我做的排序。在Table模板中,我自己渲染表:

  <table>
      <thead>
          <tr>
              <th>First Name</th>
              <th>Last Name</th>
          </tr>
      </thead>
      <tbody>   
          {{#each}}  <!-- Each row of data is rendered here -->
              <tr>
                  <td>{{firstName}}</td>
                  <td>{{lastName}}</td>
              </tr>
          {{/each}}
      </tbody>
   </table>

这很好但我现在遇到了一个问题。我需要能够从ResultController内的TableController访问属性。基本上ResultController包含有关哪些列可排序的信息。我无法弄清楚如何从孩子ResultController访问父TableController

我尝试在'TableController'中使用needs: ['result'],但这只是实例化了ResultController的新实例,而不是让我访问实际的父实例。

我在下面创建了一个工作的jsbin来设置我在这里描述的代码。

  

http://emberjs.jsbin.com/paceqaki/7/edit

非常感谢任何帮助或建议!

最佳,

赤颈

1 个答案:

答案 0 :(得分:3)

在您的情况下,我会使用PersonTableComponent,请检查example。使用渲染助手主要用于特定的路线上下文。我认为,你正在尝试利用&#39; sortProperties&#39;,#sort; sortAscending&#39;功能由Ember.SortableMixin提供,不幸的是,这个mixin似乎只能用于ArrayProxy实例,所以你需要在组件中实现排序功能。

<script type="text/x-handlebars" data-template-name="components/person-table">  
    <h3>{{header}} )</h3>
     <table>
      <thead>
          <tr>
             <th {{action 'toggleSortFirstName' }}>First Name</th>
             <th {{action 'toggleSortLastName'}}>Last Name</th>
          </tr>
      </thead>
      <tbody>   
          {{#each sortedPeople}}
              <tr>
                  <td>{{firstName}}</td>
                  <td>{{lastName}}</td>
              </tr>
          {{/each}}
      </tbody>
   </table>
</script>



<script type="text/x-handlebars" data-template-name="index">  
    {{#each controller}}
        {{person-table header=header people=rows}}
    {{/each}}
</script>

App.PersonTableComponent = Ember.Component.extend({
  sortProperty: 'lastName',
  sortAscending: true,


  sortedPeople: Em.computed(function(){

    // define your sorting functionality
    return this.get('people').sort( function(item) {
      return -1;
    });

  }).property('people.@each', 'sortProperty', 'sortAscending'),

  actions: {
    toggleSortFirstName: function() {


      var sortValue = !this.get('firstNameSortValue');

      // save current sort state
      this.set('fistNameSortValue', sortValue);
      this.setProperties({sortProperty: 'firstName',
                          sortAscending: sortValue});

    },
    toggleSortLastName: function() {

      var sortValue = !this.get('lastNameSortValue');

      // save current sort state
      this.set('lastNameSortValue', sortValue);
      this.setProperties({sortProperty: 'lastName',
                          sortAscending: sortValue});
    }
  }
});

查看EmberJS指南部分ComponentRendering with helper