代码之家  ›  专栏  ›  技术社区  ›  Jacob van Lingen

Ember Data从存储中抓取已加载的对象

  •  1
  • Jacob van Lingen  · 技术社区  · 9 年前

    使用Ember 1.13.6和Ember Data 1.13.7,我想知道如何在不调用服务器(其中关系是异步的)的情况下从存储中获取已加载的对象。

    下图为模型:

    //page model
    export default DS.Model.extend({
        parent: DS.belongsTo('page', { async: false, inverse: 'subpages'}),
        subpages: DS.hasMany('page',{ async: true, inverse: 'parent' }),
     });
    

    如果你只是打电话 model.get('subpages') ,Ember Data返回一个承诺+调用服务器。通常情况下,这是很好的行为,但现在我有一个特殊情况,我只想抓取已经加载的对象。

    我在文件中找不到关于这种情况的任何信息。目前我找到的唯一方法是使用私人财产:

    model._internalModel._relationships.initializedRelationships.subpages.canonicalState
    

    当然,我寻求一种正常的方式来实现这一点,而不触及Ember Data的内部代码。那么有人知道如何做到这一点吗?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Kit Sunde    9 年前

    我认为你不能直接从关系中做到,但你可以偷看。

    this.store.peekAll('page')
    

    不会调用后端。你可以使用过滤器,它们不会到达后端:

    existingSubpages: function(){
      return this.store.filter('page', item => {
        return item.parent === this;
      });
    }.property('subpages.@each')
    
        2
  •  0
  •   Jacob van Lingen    9 年前

    除了@Kit Sunde的答案之外,可能还有一种情况,您希望某些对象具有异步关系,而其他对象具有同步关系。

    使用就绪挂钩,可以轻松实现:

     ready() {
        if(this.get('relationIsSynced')) { //whater case you got
            this.set('subpages.content.relationship.isAsync', false);
        }
     }