Javascript Ember.RSVP.hash给出';无法将对象转换为基本值';模型中的路线钩
编辑:进一步看,有东西在调用从模型挂钩返回的数组上的Javascript Ember.RSVP.hash给出';无法将对象转换为基本值';模型中的路线钩,javascript,asynchronous,ember.js,promise,ember-data,Javascript,Asynchronous,Ember.js,Promise,Ember Data,编辑:进一步看,有东西在调用从模型挂钩返回的数组上的toString。硬编码,这个方法工作得很好,但是像下面一样返回,它不工作 TL;DR:我正在将一个数据数组转换为不同的“格式”,以便使用余烬图表附加组件。为此,我在路径的模型钩子中使用了Ember.RSVP,但我得到了一个TypeError:无法将对象转换为原语值,并且不知道为什么 我一直在学习Ember(遵循他们的快速入门和超级租赁教程),现在我正试图用它来构建我自己的项目 我遇到的问题是如何处理路由的模型钩子中的异步操作。这可能是一个很长
toString
。硬编码,这个方法工作得很好,但是像下面一样返回,它不工作
TL;DR:我正在将一个数据数组转换为不同的“格式”,以便使用余烬图表附加组件。为此,我在路径的模型钩子中使用了Ember.RSVP,但我得到了一个TypeError:无法将对象转换为原语值,并且不知道为什么
我一直在学习Ember(遵循他们的快速入门和超级租赁教程),现在我正试图用它来构建我自己的项目
我遇到的问题是如何处理路由的模型钩子中的异步操作。这可能是一个很长的阅读,但我试图非常具体。然而,最终的问题是,我得到了一个TypeError:最后无法将对象转换为原始值
我使用幻影来伪造后端API,它会像这样返回我的数据:
{
"data": [
{
"id": "May, 2017",
"type": "month",
"attributes": {
"label": "05/2017",
"value": 6
}
}, {
"id": "April, 2017",
"type": "month",
"attributes": {
"label": "04/2017",
"value": 5
}
}, {
"id": "March, 2017",
"type": "month",
"attributes": {
"label": "03/2017",
"value": 4
}
}, {
"id": "February, 2017",
"type": "month",
"attributes": {
"label": "02/2017",
"value": 3
}
}, {
"id": "January, 2017",
"type": "month",
"attributes": {
"label": "01/2017",
"value": 2
}
}, {
"id": "December, 2016",
"type": "month",
"attributes": {
"label": "12/2016",
"value": 1
}
}
]
};
model() {
// Fetch month data from store
return this.get('store').findAll('month').then(data => {
var monthsArray = [];
data.content.forEach(month => {
monthsArray.push(month.__data);
});
// Must convert into normal JS object to avoid TypeError: cannot convert object into primitive value
return JSON.parse(JSON.stringify(monthsArray));
});
}
我还使用Addepar()中的余烬图表,它需要类似以下的数据(组标签是可选的,我的应用程序不使用它,但这是从Addepar的文档中获取的):
基本上,因为我遵循JSONAPI规范,所以我从API接收的数据看起来与需要传递到Ember Charts垂直条形图组件的数据不同
到目前为止,我的解决方案(不起作用)是循环初始数据并填充一个新数组,该数组看起来就像余烬图表所需要的那样。据我所知,这只能异步发生,因为我必须进行API调用(对我的存储进行调用),然后在从模型挂钩返回新数组之前对得到的结果进行操作
下面是我现在使用的实际代码:
import Ember from 'ember';
export default Ember.Route.extend({
model() {
var results = this.get('store').findAll('month');
var months = results.then(function(data) {
var monthsArray = [];
data.content.forEach(month => {
monthsArray.push(month.__data);
});
return Ember.RSVP.all(monthsArray);
});
return Ember.RSVP.hash({
data: months
});
}
});
在我的模板中可以这样访问它(该组件由Ember Charts插件提供){{{vertical bar chart data=model.data}}
如开头所述,我得到了一个类型错误:无法将对象转换为原语值
。关于它的来源,我唯一的线索是,如果我硬编码数据(第二种,正确的格式)并返回它,而不是从Mirage中提取数据,条形图填充得非常好。但是如果我按照上面的方法去做,我会得到错误。我使用afterModel钩子连接到console.log(resolvedModel)
,数据在那里。也许这不是一个好的指标
不管怎样,我对灰烬是超级绿色的,我可能只是误解了所有这些东西。感谢您的帮助。很抱歉写了这么长的文章。编辑:答案仍然在于JSON.parse(JSON.stringify(data))
,但我更新了kumkanillam更简单的返回数据的方法
结果表明,错误来自对从模型挂钩返回的数据调用的Array.toString
。它在硬编码的对象数组上工作得很好,但在通过RSVP返回时就不行了
在检查了两者之后,发现在使用Ember.RSVP时,返回数组中的对象缺少toString方法,不知何故。。。我试图通过使用Object.create()设置原型来解决这个问题,但没有成功
底线是,我仍然不是100%清楚,我想也许余烬把我的数组变成了其他东西(一个余烬对象?),而不仅仅是一个简单的JS对象数组。因此,我最终通过
现在的路线如下所示:
{
"data": [
{
"id": "May, 2017",
"type": "month",
"attributes": {
"label": "05/2017",
"value": 6
}
}, {
"id": "April, 2017",
"type": "month",
"attributes": {
"label": "04/2017",
"value": 5
}
}, {
"id": "March, 2017",
"type": "month",
"attributes": {
"label": "03/2017",
"value": 4
}
}, {
"id": "February, 2017",
"type": "month",
"attributes": {
"label": "02/2017",
"value": 3
}
}, {
"id": "January, 2017",
"type": "month",
"attributes": {
"label": "01/2017",
"value": 2
}
}, {
"id": "December, 2016",
"type": "month",
"attributes": {
"label": "12/2016",
"value": 1
}
}
]
};
model() {
// Fetch month data from store
return this.get('store').findAll('month').then(data => {
var monthsArray = [];
data.content.forEach(month => {
monthsArray.push(month.__data);
});
// Must convert into normal JS object to avoid TypeError: cannot convert object into primitive value
return JSON.parse(JSON.stringify(monthsArray));
});
}
JSON.parse(JSON.stringify(data))
基本上将数据转换为字符串,然后将其转换回JS对象。它感觉有点脏,但在做了5个小时同样的事情后,它是唯一有效的东西 为什么需要RSVP.all和RSVP.hash?。我在你的要求中遗漏了一些东西。
也许你可以尝试一下下面的代码
model() {
return this.get('store').findAll('month').then(data => {
var monthsArray = [];
data.content.forEach(month => {
monthsArray.push(month.__data);
});
return monthsArray;
});
}
然后你需要像访问Ember.RSVP的模型
参数一样访问它。所有这些都应该是一系列承诺,你正在传递普通的目标!仍然没有解决实际问题(转换类型错误…仍然必须在我的回答中进行JSON转换),但它确实从我正在做的事情中删除了大量不必要的代码。我已经把异步行为复杂化了。