Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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
Javascript Ember.RSVP.hash给出';无法将对象转换为基本值';模型中的路线钩_Javascript_Asynchronous_Ember.js_Promise_Ember Data - Fatal编程技术网

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转换),但它确实从我正在做的事情中删除了大量不必要的代码。我已经把异步行为复杂化了。