Ember分页完整的例子

时间:2012-10-22 09:51:49

标签: ember.js

我想知道是否有一个完整的例子可以证明我们如何使用ember.js的分页

我有一个包含很多行的表,所以我想使用分页来帮助用户进行数据分析。

我已经看到了Ember.PaginationSupport.js但我找不到在html视图中使用它的方法。

4 个答案:

答案 0 :(得分:51)

以下更新的示例适用于ember.js RC1 - 2013年3月14日

首先你需要添加一个像mixin一样的分页,因为在ember核心中还没有一个分页

var get = Ember.get, set = Ember.set;

Ember.PaginationMixin = Ember.Mixin.create({

  pages: function() {

    var availablePages = this.get('availablePages'),
    pages = [],
    page;

    for (i = 0; i < availablePages; i++) {
      page = i + 1;
      pages.push({ page_id: page.toString() });
    }

    return pages;

  }.property('availablePages'),

  currentPage: function() {

    return parseInt(this.get('selectedPage'), 10) || 1;

  }.property('selectedPage'),

  nextPage: function() {

    var nextPage = this.get('currentPage') + 1;
    var availablePages = this.get('availablePages');

    if (nextPage <= availablePages) {
        return Ember.Object.create({id: nextPage});
    }else{
        return Ember.Object.create({id: this.get('currentPage')});
    }

  }.property('currentPage', 'availablePages'),

  prevPage: function() {

    var prevPage = this.get('currentPage') - 1;

    if (prevPage > 0) {
        return Ember.Object.create({id: prevPage});
    }else{
        return Ember.Object.create({id: this.get('currentPage')});
    }

  }.property('currentPage'),

  availablePages: function() {

    return Math.ceil((this.get('content.length') / this.get('itemsPerPage')) || 1);

  }.property('content.length'),

  paginatedContent: function() {

    var selectedPage = this.get('selectedPage') || 1;
    var upperBound = (selectedPage * this.get('itemsPerPage'));
    var lowerBound = (selectedPage * this.get('itemsPerPage')) - this.get('itemsPerPage');
    var models = this.get('content');

    return models.slice(lowerBound, upperBound);

  }.property('selectedPage', 'content.@each')

});

接下来,您需要在ArrayController中使用上面的mixin,如此

PersonApp.PersonController = Ember.ArrayController.extend(Ember.PaginationMixin, {  
    itemsPerPage: 2
});

接下来,您可以添加一个简单的帮助器视图,以将页码显示为li标签

PersonApp.PaginationView = Ember.View.extend({
    templateName: 'pagination',
    tagName: 'li',

    page: function() {
        return Ember.Object.create({id: this.get('content.page_id')});
    }.property()
});

您的路线可能看起来像这样(父母下的嵌套页面)

PersonApp.Router.map(function(match) {
    this.resource("person", { path: "/" }, function() {
        this.route("page", { path: "/page/:page_id" });
    });
});

PersonApp.PersonPageRoute = Ember.Route.extend({
    model: function(params) {
        return Ember.Object.create({id: params.page_id});
    },
    setupController: function(controller, model) {
        this.controllerFor('person').set('selectedPage', model.get('id'));
    }
});

PersonApp.PersonRoute = Ember.Route.extend({
    model: function(params) {
        this.controllerFor('person').set('selectedPage', 1);
        return PersonApp.Person.find();
    }
});

最后,你需要添加一些html来显示它

<script type="text/x-handlebars" data-template-name="application">

  <div id="main">
    {{ outlet }}
  </div>

</script>

<script type="text/x-handlebars" data-template-name="person">

<table width="250px">                                                               
<thead>
<th>id</th>
<th>username</th>
</thead>
<tbody>
   {{#each person in controller.paginatedContent}}
    <tr>
      <td>{{person.id}}</td>
      <td>{{view Ember.TextField valueBinding="person.username"}}</td>
    </tr>
   {{/each}}
</tbody>
</table>

<div name="prev">{{#linkTo 'person.page' prevPage target="controller"}}Prev{{/linkTo}}</div>
<ul class="pagination gui-text">
  {{#each pages}}
    {{view PersonApp.PaginationView contentBinding="this"}}
  {{/each}}
</ul>
<div name="next">{{#linkTo 'person.page' nextPage target="controller"}}Next{{/linkTo}}</div>

</script>

<script type="text/x-handlebars" data-template-name="pagination">

{{#with view}}
{{#linkTo 'person.page' page}}
  {{content.page_id}}
{{/linkTo}}                                                                         
{{/with}}

</script>

如果您希望看到它正常工作,这是一个完整的工作项目

https://github.com/toranb/ember-pagination-example

答案 1 :(得分:2)

经过我朋友埃德加的一些改进和帮助,我们想出了一个非常简单的解决方案,你可以在GitHub

查看

基本上我们扩展了Ember.ArrayProxy以完成分页,并添加了管理previus和next页面的操作。

感谢@Toran Billups的解决方案和算法@Jeremy Brown

答案 2 :(得分:1)

我在https://github.com/notmessenger/emberjs-pageable取得了巨大的成功,但Ember现在已经在ArrayController中本地构建了一个名为arrangedContent的东西。您还可以在模型的特定字段上指定默认排序顺序。 Ember.js and arrangedContent稍微讨论一下。

答案 3 :(得分:0)

你可能想在这个npm模块中查看Ember中的一个简单的分页实现: Ember CLI Simple Pagination