我有点困惑。组件,控制器,路线,助手等。我只是想从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,但无法将其传递回来以返回零件...我缺少什么?还是我做错了什么?
答案 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'}}
所有这些都是伪代码,可能不起作用。但是,您仍然应该能够按照指南进行操作,并将信息拼凑在一起,以获得所需的结果。