Ember.js从URL获取JSON数据

时间:2018-06-23 16:18:24

标签: ember.js

我有点困惑。组件,控制器,路线,助手等。我只是想从JSON文件中获取一个值,然后使用Ember.Helper上的值进行计算。我现在不知道该使用哪种方式来烧脑。有人可以帮我抓住“ {_3}}”上等于“ BTC_USDT”的“ market_name”的“卖出”部分并将其放入助手中吗?

编辑:

事实上,我尝试做类似的事情。

import Ember from 'ember';

export function formatBTC(value) {
    var url = 'https://stocks.exchange/api2/prices';
    var btc_price = Ember.$.getJSON(url).then(function(data) {
        for (var i=0; i <= data.length-1; i += 1)
        {
            if (data[i].market_name == "BTC_USDT")
            {
                return data[i].sell;
                console.log(data[i].sell+' - i got the value properly');
            }
        }
    });
    console.log(btc_price+' - shows nothing, i cannot pass the var btc_price to here, why not');
    calculation = value * btc_price; //some syntax may apply, maybe Number(value) or whatsoever, but i cannot have my variable btc_price returns here.
    return calculation.toFixed(8);
}

export default Ember.Helper.helper(formatBTC);

并且来自index.hbs

{{format-btc 0.001}}

仍然找不到合适的解决方案。我以btc_price的形式获取数据[i] .sell,但无法将其传递回来以返回零件...我缺少什么?还是我做错了什么?

1 个答案:

答案 0 :(得分:4)

您遇到的问题是因为执行了ajax请求。继续执行函数,并在promise返回之前返回值。

从技术上讲,您可以解决此问题并在helper函数中使用async / await,但会遇到另一个问题-每次调用helper时,您都会发出一个新的ajax请求,该请求将获取当前价格并计算值。

我的建议是,使用模型和控制器的组合来代替帮助器。因为您目前对框架不知所措,所以我实际上会提出使用服务+组件的第二个建议

我建议使用一种服务或一​​种模型,因为您希望保留从定价来源获取的数据。如果不这样做,则辅助程序/组件的每个实例都会发出一个新请求以获取数据。

服务

服务是ember中的一种会话集合。在数据将保留之后,它只会实例化一次。

ember g service pricing

在init块中,设置默认值并发出ajax请求。

# services/pricing.js
btcPrice:null,
init() {
    this._super(...arguments);
    Ember.$.getJSON(...).then(val=>{
        # get correct value from response
        # The way you were getting the value in your example was incorrect - you're dealing with an array.
        # filter through the array and get the correct value first
        this.set('btcPrice',val.btcPrice);
    })
}

组件

然后您可以将服务注入组件并使用一致的价格。

ember g component format-btc

修改组件的控制器以注入服务并计算新值。

#components/format-btc.js
pricing: Ember.inject.service('pricing')
convertedPrice: Ember.computed('pricing',function(){
    return pricing.btcPrice*this.get('bitcoins')
})

该组件的模板将简单地返回转换后的价格。

#templates/components/format-btc.js
{{convertedPrice}}

然后您将调用该组件,将比特币作为参数传递

{{format-btc bitcoints='1234'}}

所有这些都是伪代码,可能不起作用。但是,您仍然应该能够按照指南进行操作,并将信息拼凑在一起,以获得所需的结果。