【问题标题】:Find the class name of a relation from the instance of a model in ember JS从ember JS中的模型实例中找到关系的类名
【发布时间】:2018-09-12 12:06:09
【问题描述】:

我有foo ember-data 模型thing 的一个实例。 thing.js 具有以下属性:

owner: DS.belongsTo('user')

如果我有一个空所有者的foo,我如何才能仅使用foo'owner' 字符串来检索代表所有者关系模型的值'user'

编辑:我想让我的选择关系组件处理名称与类名不同的关系

【问题讨论】:

  • 嘿@Syl,您可以分享更多关于您当前模型关系的详细信息吗?为关系使用不同的属性名称是很正常的事情。我认为您可能会丢失商店中的一些数据或您的 api 响应

标签: ember.js


【解决方案1】:

听起来您需要完成一些工作才能完成人际关系的建立。阅读指南中的this page

如果关系设置正确,要获取关联用户,您应该可以执行foo.owner。这假设用户已经存在于商店中。我建议使用Ember Inspector 浏览器插件来调试关系。

【讨论】:

  • 我正在制作一个通用选择组件来选择一个属于关系。只有关系的记录和名称,当关系的名称与模型不同时,它不起作用(owner belongsTo('user'))。 select取值后建立关系时,必须做peekRecord,而且需要模型名。
  • 哦,我现在明白您所说的需要模型名称是什么意思了。谢谢你的解释。我将在 Ember Discord 聊天中分享这个,看看是否有其他人可以在这里添加答案。我很确定它可以在没有私有 API 的情况下完成。
【解决方案2】:

这看起来像是typeForRelationship 的用例。

在您的示例中,您应该能够执行类似的操作

store.modelFor('thing').typeForRelationship('owner', store);

如果您不喜欢这种方法,您可以使用belongsTo reference API,您可以在其中使用关系中的元数据来获取类型

foo.belongsTo('owner').type

这种方法的唯一问题是type 属性可能不是公共 API,并且可能(尽管不太可能)在某些时候发生更改。

【讨论】:

    【解决方案3】:

    看来我可以做到以下几点:

    this.get('model').get('_internalModel._relationships.initializedRelationships.'+this.get('relation')+'.relationshipMeta.type')

    model 是一个实例,relation 是关系名称的字符串,它正确地返回了关系的模型。

    编辑:不使用 ember discord 提供的私有 API 的更好解决方案:

    function getRelatedModelName(record, relationName){
            let ParentModelClass = record.constructor;
            let meta  = get(ParentModelClass, 'relationshipsByName').get(relationName);
            return meta.type;
          }
    

    【讨论】:

    • 此解决方案不可取,因为它似乎依赖于私有 API。下划线通常表示这个意思。与大多数 semver 项目一样,在 Ember Data 中,私有 API 可以随时更改,而无需遵循弃用流程。这可能会在没有警告的情况下中断。
    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2021-12-19
    相关资源
    最近更新 更多