Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 获取余烬数据模型关系类型_Ember.js_Ember Data - Fatal编程技术网

Ember.js 获取余烬数据模型关系类型

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关系,如何签入代码 目前,我已经想出了两个可行的解决方案,但我觉得它们有点混乱,我相信一定有更好的办法 一种有效

我使用的是余烬1.13.2和余烬数据1.13.4

我试图找出一个模型的关系类型。以下面的模型为例

// 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。