Ember.js 获取余烬数据模型关系类型
我使用的是余烬1.13.2和余烬数据1.13.4 我试图找出一个模型的关系类型。以下面的模型为例Ember.js 获取余烬数据模型关系类型,ember.js,ember-data,Ember.js,Ember Data,我使用的是余烬1.13.2和余烬数据1.13.4 我试图找出一个模型的关系类型。以下面的模型为例 // my post model export default DS.Model.extend({ author: DS.belongsTo('author'), comments: DS.hasMany('comment') }); 如果注释是hasMany或belongsTo关系,如何签入代码 目前,我已经想出了两个可行的解决方案,但我觉得它们有点混乱,我相信一定有更好的办法 一种有效
// my post model
export default DS.Model.extend({
author: DS.belongsTo('author'),
comments: DS.hasMany('comment')
});
如果注释
是hasMany或belongsTo关系,如何签入代码
目前,我已经想出了两个可行的解决方案,但我觉得它们有点混乱,我相信一定有更好的办法
一种有效的方法是
var relationship = post.get(relationshipName); // relationshipName = 'comments'
if ( relationship.constructor.toString().indexOf('Array') !== -1 ) {
relationshipType = 'hasMany';
}
else if ( relationship.constructor.toString().indexOf('Object') !== -1 ) {
relationshipType = 'belongsTo';
}
另一种可行的方法
var relationship = post.get(relationshipName); // relationshipName = 'comments'
if (relationship.get('@each')) {
relationshipType = 'hasMany';
}
else {
relationshipType = 'belongsTo';
}
它们都能工作,但它们对我来说都有点笨重,我不知道它们有多可靠
所以问题是,哪种方法更可靠?。。或者有更好的方法吗?您可以检查
字段
import Post from '../models/post'
Ember.get(Post, 'fields').get('comments'); // hasMany
或者,如果您有一个模型实例,您可以勾选构造函数:
Ember.get(post.constructor, 'fields').get('comments'); // hasMany
您可以检查字段
import Post from '../models/post'
Ember.get(Post, 'fields').get('comments'); // hasMany
或者,如果您有一个模型实例,您可以勾选构造函数:
Ember.get(post.constructor, 'fields').get('comments'); // hasMany
As hasMany returns DS.ManyArray和BELONGS的实例返回DS.Model,您可以通过以下实例进行检查:
var something = post.get(relationshipName); // relationshipName = 'comments'
var relationshipType = 'belongsTo';
if(something instanceof DS.ManyArray) {
relationshipType = 'hasMany';
}
更进一步,您可以使用以下代码确定字段是否完全不是模型(即计算属性):
另一种方法是,如果出于任何原因不想导入DS,请检查“关系”属性:
var something = post.get(name);
var propertyType = 'unknown';
if(something instanceof DS.ManyArray) {
propertyType = 'relationship:hasMany';
} else if(something instanceof DS.Model) {
propertyType= 'relationship:belongsTo';
} else if(/*whatever you want*/) {
propertyType = /*whatever you want*/;
} else {
propertyType = 'unknown';
}
var something = post.get(relationshipName); // relationshipName = 'comments'
var relationshipType = relationship.hasOwnProperty('relationship') ? 'hasMany' : 'belongsTo';
只有当您确定“某物”是关系时,此项才可以,因为如果“某物”只是一个模型、计算属性等,它将为您提供假阳性。因为有许多返回DS.ManyArray实例和belongs返回DS.model,您可以通过以下实例检查:
var something = post.get(relationshipName); // relationshipName = 'comments'
var relationshipType = 'belongsTo';
if(something instanceof DS.ManyArray) {
relationshipType = 'hasMany';
}
更进一步,您可以使用以下代码确定字段是否完全不是模型(即计算属性):
另一种方法是,如果出于任何原因不想导入DS,请检查“关系”属性:
var something = post.get(name);
var propertyType = 'unknown';
if(something instanceof DS.ManyArray) {
propertyType = 'relationship:hasMany';
} else if(something instanceof DS.Model) {
propertyType= 'relationship:belongsTo';
} else if(/*whatever you want*/) {
propertyType = /*whatever you want*/;
} else {
propertyType = 'unknown';
}
var something = post.get(relationshipName); // relationshipName = 'comments'
var relationshipType = relationship.hasOwnProperty('relationship') ? 'hasMany' : 'belongsTo';
只有当你确信“某物”是关系时,这一条才是正确的,因为如果“某物”只是一个模型、计算属性等,它会给你带来假阳性。我想你正在寻找
例如:
我想你在找我
例如:
当使用post.get('comments')
访问关系时,您将获得值,而不是特殊的关系对象。根据您的代码,我建议将代码移动到post模型本身,例如:post.doSomethingWithAllBelongsTo()
,并将该方法添加到您的post模型中。在那里,您可以使用this.eachRelationship
访问该模型的所有关系,在这里您可以访问该类关系。当使用post.get('comments')
访问该关系时,将为您提供值,而不是特殊的关系对象。根据您的代码,我建议将代码移动到post模型本身,例如:post.doSomethingWithAllBelongsTo()
,并将该方法添加到您的post模型中。在那里,您可以通过此访问该模型的所有关系。每个关系都可以访问该类关系。谢谢!很酷的回答谢谢你!很酷的回答这不再适用于余烬辛烷值(>3.15)。关于如何使用辛烷值的ManyArray instanceof有什么建议吗?我认为棘手的部分是ManyArray的导入,因为不再支持从“余烬数据”导入DS。关于如何使用辛烷值的ManyArray instanceof有什么建议吗?我认为棘手的部分是ManyArray的导入,因为不再支持从“余烬数据”导入DS。