【问题标题】:Fine-tune refreshing of multiple models in Ember routeEmber 路由中多个模型的微调刷新
【发布时间】:2017-01-31 00:50:30
【问题描述】:

有一种众所周知的方法可以支持在 Ember 路由中加载多个模型承诺,使用 Ember.RSVP.hash

// app/routes/posts.js

export default Ember.Route.extend({

  model(params) {
    return Ember.RSVP.hash({
      posts: this.store.findAll('post', params),
      tags: this.store.findAll('tag', params),
    });
  },

});

现在我有一个page 参数,可以批量加载帖子,而不是一次加载并显示它们。但是页面更改不会改变标签。然而,当页面参数发生变化时,整个路由模型再次被触发重新加载,导致应用重新获取新页面的帖子,并重新获取相同的标签。

有没有办法对此进行微调,以便在某些参数更改时不加载标签?

【问题讨论】:

    标签: javascript ember.js ember-router


    【解决方案1】:

    有几种方法可以重构您的代码。就像将标签移出模型一样。或者以不同的方式进行分页(不刷新模型)。我喜欢的是编写一个自定义的 getAll 实用程序。

    var cache = {}; // model_name => Promise<[Record]>
    
    function getAll(store, model) {
        if(!store.modelFor(model).cacheable) {
            return store.findAll(model);
        }
    
        if(!cache[model]) {
            cache[model] = store.findAll(model);
        }
    
        return cache[model];
    }
    

    现在在你的模型中

    import { getAll } from 'utils/store';
    ...
    tags: getAll('tag'),
    

    【讨论】:

    • 问题是,在我面临的实际场景中(当然不是帖子和标签示例)Ember.RSVP.hash 中获取的子模型之一取决于一些但不是全部路线参数已更改。另一个取决于任何已更改的参数。所以我仍然需要模型挂钩params 来获取第二个子模型。我只是不希望在更改的参数不影响其结果时重新获取它。
    • 好吧,您可以根据需要修改上面给出的示例,为缓存属性(参数)添加附加参数如果参数相同且模型名称相同,则从缓存中获取,否则加载新的。
    • @Ernesto 成功了吗?
    • 我最终没有使用任何缓存解决方案,你知道是因为计算机科学中只有两件难事:缓存失效和命名。我最终提取了第二个并不总是更改的子模型,并将其放入一个组件中,该组件是页面中唯一使用此附加模型的地方。当相关参数发生变化并刷新数据时通知组件。
    猜你喜欢
    • 2018-03-22
    • 2017-04-15
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多