Javascript 将$.getJSON对象传递给另一个ember控制器

Javascript 将$.getJSON对象传递给另一个ember控制器,javascript,json,object,ember.js,Javascript,Json,Object,Ember.js,所以我正在努力让它工作。也许我的方法不好。我非常擅长使用像ember.js这样的前端框架 因此,我有一个$.getJSON请求,从本地文件获取JSON数据。问题是我需要传递这些数据,不是传递给模板,而是传递给一个ember控制器内的另一个对象 我正在尝试使用ember CLI图表来返回属性最后一行中的对象 diffData: Ember.computed('model', function(){ let url = "log_hr24_diff.json"; let diff_

所以我正在努力让它工作。也许我的方法不好。我非常擅长使用像ember.js这样的前端框架

因此,我有一个$.getJSON请求,从本地文件获取JSON数据。问题是我需要传递这些数据,不是传递给模板,而是传递给一个ember控制器内的另一个对象

我正在尝试使用ember CLI图表来返回属性最后一行中的对象

diffData: Ember.computed('model', function(){

    let url = "log_hr24_diff.json";
    let diff_data = Ember.$.getJSON(url);         

    return {
      labels: ['Difficulty', 'Date'],
      datasets: [
      {
        label: "Difficulty",
        data: diff_data
        },
        {
        label: "Date",
        data: date_data
        }
      ]
    }
})
所以这是行不通的。要么这样做:

let diff_data = Ember.$.getJSON(url).then(function(data){
   return Ember.Object.create(data);
});
那么如何从
diff_data
JSON响应中获取JSON对象,并将其传递给返回对象呢

尝试了很多次,但都找不到答案


提前谢谢

创建一个服务更有意义,这样您就可以在许多控制器(或组件和模型)中使用(简单地说是“使用”)您的getJson调用,并根据需要每次更改url。 当考虑使代码可重用时,这是有意义的。 为此,您需要通过CLI创建一个服务

Ember g service someServiceName
那么您的服务可能看起来有点像这样:

import Ember from 'ember';

export default Ember.Service.extend({
    getUrlData(url){

    let data = Ember.$.getJSON(url);

    return data.then((json) => {

      let records = [];
      json.forEach(function(item){        
        records.push(item);        
      });

      return records;
    });
  }

});
对于任何高级读者,我都避免了解构(即使用const)以避免操作混乱

回到控制器中,您可以编写类似以下内容:

import Ember from 'ember';

export default Ember.Controller.extend({

serviceToUse: Ember.inject.service('some-service-name'), 
diffData: Ember.computed('model', function(){   

    let url = "log_hr24_diff.json";
    let diff_data = this.get('serviceToUse').getUrlData(url);

        //parse returnedData or put it in a new variable to use as you see fit.
        return {
            labels: ['Difficulty', 'Date'],
            datasets: [
                {
                    label: "Difficulty",
                    data: diff_data
                },
                {
                    label: "Date",
                    data: date_data
                }
            ]
        }           
})
现在,在该控制器的把手文件中,您可以从控制器访问数据,如下所示:

{{diffData.labels}} //outputs "Difficulty,Date". You can loop through the datasets property yourself.
初学者提示-文件名应该相互匹配,这就是Ember知道如何链接文件的原因。这并不一定是真的,但现在要坚持这条规则


这会让你到达你想去的地方。它在我的机器上工作。

因此,我终于找到了在余烬中编码它的正确方法(或者一种方法)

我意识到我需要将差异和日期数据返回到模型中。所以我做了这个

routes/index.js

然后在主索引控制器文件中,只需使用此模型数据将json数据传递给正确的最终对象:

控制器/index.js


所以这对我来说是在余烬上做事的正确方式。获取模型中的数据,将数据传递给控制器进行逻辑处理,最后将结果对象传递给视图。

非常感谢!我有另一种方法让它工作,但你的方法似乎更可重用。非常感谢你花时间在这里!我在另一篇文章中更新了我的方法。让我知道你的想法!谢谢@我是大卫。最后一件可以尝试的事情是创建一个名为“URL”的数组,并将“log_hr24_diff.json”和“log_hr24_dates.json”放在这个新数组中。然后您可以创建另一个数组来保存从getJSON调用返回的数据(可以称之为“JSONDATASET”)。最后,您可以对“URL”进行foreach数组,这意味着您只需编写一次“Ember.$.getJSON”,这意味着您不会重复自己的操作。在foreach中,您可以使用.push()将第一个url的结果推送到“jsonDatasets”的第一个索引位置。为以后的更多url设置代码。@Oisenfoley好的。我会这样做的!谢谢您的建议!
url = "log_hr24_diff.json";
var diff_data = Ember.$.getJSON(url, function(data){
    return Ember.Object.create(data);
});

url = "log_hr24_dates.json"
var dates_data = Ember.$.getJSON(url, function(data){
    return Ember.Object.create(data);
});

export default Ember.Route.extend({
  model(){
    return Ember.RSVP.hash({
      price: price_data,
      chart_diff: diff_data,
      chart_dates: dates_data
    });
  },
});
export default Ember.Controller.extend({
  applicationController: Ember.inject.controller('application'),

  diffData: Ember.computed('model', function(){
    return {
      labels: this.get('model.chart_dates'),
      datasets: [
      {
        label: "Difficulty",
        data: this.get('model.chart_diff')
        }
      ]
    }
  })

});