【问题标题】:Filtered array of local Model records过滤后的本地模型记录数组
【发布时间】:2013-10-05 08:15:27
【问题描述】:

我有一个阵列控制器ActivitiesController,它负责管理一天的活动(相对于全套活动)。我已将ActivitiesRoutemodel 属性设置为以下内容:

return this.store.find('activity', {on_date: params.on_date});

这确实拉回了适当的记录,我可以在 Ember 调试器中看到它们,但由于某种原因,这些记录对模板不可用 (activities.hbs)。这让我感到莫名其妙,但实际上这并不是最终的解决方案(我只是期望它会起作用)。

我真正想做的是让控制器的内容管理一组 local Activity 已过滤到指定日期的记录。然后,此过滤后的数组将根据对更新查询的异步调用定期更新:find('activity', {on_date: this.get('on_date'), since: this.get('since');

我希望描述是有道理的。我查看了关于 SO 的其他查询,并且有一些有希望的开始,但答案似乎都过时了,我可以找到任何可以帮助我解决这个问题的东西。

总之,我想:

  1. 让控制器的 content 成为与给定日期对应的本地 Activity 记录的主动过滤器。
  2. 能够将其他记录异步推送到模型上,这些记录将自动显示在控制器上(假设它们是在适当的日期)。

顺便说一句,我特别想知道为什么我当前的 model 钩子在活动模板中不可用。

------------- 更新 -------------

我已经在我的模型钩子中尝试过这个:

return this.store.filter('activity',function(activity){
    var itemDate = new Date(activity.get('start_time'));
    itemDate = moment(itemDate).format('YYYY-MM-DD');
    return itemDate === params.on_date;
});

这应该符合@Bradley 的建议。我需要截断时间组件,所以我使用 moment.js 库添加了该逻辑。这不会引发任何错误,但也不会自行从服务器中提取任何记录,因此我将以下代码行添加到模型挂钩中:

this.set('activities', this.store.find('activity', {on_date: params.on_date}));

使用调试器我可以看到ActivityRoute 有一个activities 属性设置为DS.PromiseArray,我可以看到activities 属性的长度为15,这是活动的数量那天。

看起来ActivityRoutecurrentModel 设置为DS.FilteredRecordArray 并且其中也有相应的15 条记录,但我的车把模板仍然无法对其进行迭代。我认为这是因为未设置 ActivityControllercontent 属性。为什么在这种情况下 Ember 不执行此步骤?我是否需要强制执行此操作,或者系统中是否存在需要调整的小精灵?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    对于本地过滤,您正在寻找 DS.Store#filter 函数。

    return this.store.filter('activity', function(activity) { 
      activity.get('on_date') === params.on_date
    });
    

    这会返回一个 DS.FilteredRecordArray,它会使用新的/更新的记录进行实时更新

    【讨论】:

    • 射击,我一直在寻找这样的东西,但不知何故错过了它。谢谢。在文档中,提到了大型(或快速更新)客户端记录集的潜在性能问题。您知道添加抽象层来处理此问题的设计模式示例吗?
    • 哦,还有我今天的“虚拟”问题......我如何才能在不触发像 find() 这样的服务器调用的情况下获得对给定类型的所有“本地”记录的引用有吗?
    • @ken,在这种情况下,this.store.all('activity') 是你的朋友
    • 我对你们的 cmets 感到很兴奋,但我仍在努力让这件事发挥作用。看来我从model 钩子返回的任何东西都无处可去。我会用那些不成功的结果更新问题。
    • 我已经对我目前的担忧进行了冗长的描述,但我已经通过将controller.set('model',this.get('currentModel')); 添加到ActivityRoutesetupController 挂钩中来解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多