【发布时间】:2014-01-15 01:20:44
【问题描述】:
这最初发布在讨论.emberjs.com 上。看: http://discuss.emberjs.com/t/what-is-the-proper-use-of-store-filter-store-find-for-infinite-scrolling/3798/2
但是这些天来,该网站的内容质量似乎越来越差,所以我希望 StackOverflow 可以拯救我。
意图:用 ember-data 构建一个页面,实现无限滚动。
背景知识:基于 ember-data 上的 emberjs.com api 文档,特别是 store.filter 和 store.find 方法(参见:http://emberjs.com/api/data/classes/DS.Store.html#method_filter)我应该能够设置模型挂钩到商店过滤器操作的承诺。 Promise 的响应应该是一个过滤的记录数组,它是一个由过滤函数过滤的存储中的项目数组,该函数假设每当新项目被推入存储时都会不断更新。通过将其与将商品推送到商店的 store.find 方法相结合,filteredRecordArray 应该会自动更新新商品,从而更新模型并导致新商品显示在页面上。
例如,假设我们有一个 Questions Route、Controller 和一个 Question 类型的模型。
App.QuestionsRoute = Ember.Route.extend({
model: function (urlParams) {
return this.get('store').filter('question', function (q) {
return true;
});
}
});
然后我们有一个控制器,它带有一些调用 store.find 的方法,这可能由一些事件/动作触发,无论是检测滚动事件还是用户显式点击加载更多,不管这个方法是否会被调用加载更多问题。 示例:
App.QuestionsController = Ember.ArrayController.extend({
...
loadMore: function (offset) {
return this.get('store').find('question', { skip: currentOffset});
}
...
});
以及渲染项目的模板:
...
{{#each question in controller}}
{{question.title}}
{{/each}}
...
注意,使用这种方法,我们NOT必须向明确调用this.get('model').pushObjects(questions);的store.find承诺添加一个函数事实上,一旦你已经返回了一个过滤器,就尝试这样做记录数组到模型不起作用。要么我们手动管理模型的内容,要么让 ember-data 完成工作,我非常希望让 Ember-data 完成工作。
这是一个非常干净的 API;但是,它似乎不像我写的那样工作。根据文档,我看不出有什么问题。
使用 chrome 中的 Ember-Inspector 工具,我可以看到来自第二个 find 调用的新问题已加载到“问题”类型下的商店中,但在我更改路线并返回之前页面不会刷新。看起来这只是观察者的问题,这让我认为这将是 Ember-Data 中的一个错误,但我不想贸然下这样的结论,直到我问我是否在使用 Ember-数据符合预期。
如果有人不知道到底出了什么问题,但知道如何使用 store.push/pushMany 在 jsbin 中重新创建此场景,这也会有所帮助。我只是不熟悉如何在商店中使用较低级别的方法。
非常感谢您的帮助。
【问题讨论】:
标签: ember-data