29

我想知道是否有一个完整的示例可以演示我们如何使用 ember.js 进行分页

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

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

4

4 回答 4

51

下面的更新示例适用于 ember.js RC1 -- 03/14/2013

首先,您需要添加一个类似 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

于 2012-10-23T15:01:28.050 回答
2

在我朋友 edgar 的一些改进和帮助下,我们想出了一个非常简单的解决方案,您可以在GitHub中查看

基本上我们扩展了 Ember.ArrayProxy 以完成分页,还添加了操作来管理上一页和下一页。

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

于 2014-08-26T20:08:30.037 回答
1

我在https://github.com/notmessenger/emberjs-pageable上取得了巨大的成功,但 Ember 现在有一些内置在 ArrayController 中的东西,称为arrangedContent它。您还可以在模型的特定字段上指定默认排序顺序。 Ember.js 和arrangedContent稍微谈了一下。

于 2013-03-22T13:40:34.587 回答
0

您可能想查看这个 npm 模块,了解 Ember 中的简单分页实现: Ember CLI Simple Pagination

于 2016-05-23T12:47:55.500 回答