4

编辑:更一般地说,我怎样才能调用 find() 并让它对结果集中的每个项目做一些事情

如何在不破坏绑定的情况下更新集合关系的成员?例如,一个模型有很多东西,但最初只加载前 10 个,然后我想用接下来的 10 个替换那些,等等,以进行分页

我可以调用 clear 并添加底层的 OrderedSet,但这会破坏我页面上的绑定,一切都消失了。

App.Category = DS.Model.extend({
  name: DS.attr('string'),
  type: DS.attr("string"),
  parent: DS.belongsTo('App.Category'),
  children: DS.hasMany('App.Category'),
  stories: DS.hasMany('App.Story'),

});

App.CategoryController = Ember.ObjectController.extend({
  page: 1,

  loadPage: function() {
    console.log(this.get('stories'))
    var s = App.Story.find({sid: this.get('id'), count: 12, page: this.get('page')})
    this.get('stories').clear()
    for (var i = 0, len = this.length; i < len; ++i) {
      this.get('stories').add(s[i])
    }
  },
  nextPage: function(event) {
    this.set('page', this.get('page') + 1)
    this.loadPage()

  },
  prevPage: function(events) {
    this.set('page', this.get('page') - 1)
    this.loadPage()
  },
  breadcrumb: function() {
    return ""
  }.property('parent'),
  sortProperties: ['created'],
  sortAscending: false,
  nextEnabled: function() {
    return true
  }.property('page'),
  prevEnabled: function() {
    if (this.get('page') > 1) {
      return true
    }
    return false
  }.property('page'),

});
4

2 回答 2

0

我建议您执行以下操作,而不是绑定到在更改页面时清空并重新填充的单个数组:

  1. 将当前页面索引存储在page控制器的属性中(完成)
  2. 将每个查询所需的项目数存储在count控制器的属性中(完成)
  3. 创建一个pageContent依赖于page和的计算属性count。它应该返回find()带有这些参数的查询
  4. 作为奖励,pageContent缓存每个查询以提高性能

您的模型和控制器看起来像这样:

App.Post = DS.Model.extend({
    title: DS.attr('string')
});

App.IndexController = Ember.Controller.extend({
    cache: [],
    counts: [5, 10, 20, 50],

    page: 0,
    count: 5,

    pageContent: function() {
        var page = this.get('page');
        var count = this.get('count');
        var key = this.keyFor(page, count);

        var cache = this.get('cache');
        if (!cache[key]) {
            // we don't have this pair of index and count cached,
            // so retrieve data from the api and cache it
            cache[key] = App.Post.find({page: page, count: count});
        }

        return cache[key];
    }.property('page', 'count'),

    // generates hash key for page and count pair
    keyFor: function(page, count) {
        return page + '-' + count;
    },

    // actions                                            
    next: function() {
        this.incrementProperty('page');
    },

    previous: function() {
        if(this.get('page') > 0) {
            this.decrementProperty('page');
        }
    }               
});

现在在您的模板中,您绑定到pageContent.

<script type="text/x-handlebars" data-template-name="index">
    {{#each pageContent}}
        <p>-{{title}}</p>
    {{/each}}

    <button {{action previous}}>Previous</button>
    <button {{action next}}>Next</button>
    <br/>

    {{view Ember.Select contentBinding="counts" selectionBinding="count"}}
    items per page
</script>

这是在 jsfiddle 中运行的全部内容

于 2013-05-20T02:33:11.750 回答
0

通常,ORM 不提供父对象中子对象的分页。处理这个问题的正常方法是打破对象模型并为自己维护一个父对象和单独的可分页子对象集合。换句话说,您必须打破绑定,然后自己管理它们以达到本页的目的。

于 2013-05-14T06:25:21.747 回答