Emberjs就像ajax请求在Helper中返回

时间:2015-05-01 08:25:48

标签: javascript ajax asynchronous ember.js

通过大量的观察和尝试,我相信在Emberjs帮助中无法从ajax请求中返回值。 (我希望我错了。)我相信原因是整个ansyc回调的事情。

所以这就是我的困境;

我有一个父模型A,它有模型B的子项。我想显示父项和子项以及一些额外信息。额外的信息来自使用模型B的一些信息的api调用。我没有在模型B上保存这些额外的信息,但我想显示它。所以基本上,我有这样的事情:

sudo npm install -g expresso

我希望能够做到这样的事情:

{{#each modelb in modela.modelbs}}
...
{{/each}}

它返回了我能从api电话中获得的信息。

我试过像我之前说的那样使用帮手。我尝试在控制器中放置一些逻辑,但我无法隔离单个子模型以创建计算属性。 (加上我不确定计算机属性是否会对我有所帮助,我认为它需要一个return语句,这使我回到与帮助器相同的问题,我认为我不能在子关系上创建计算属性。虽然我从api调用中获得了我需要的额外信息,但我无法将其与我的孩子模型B联系起来。

我想我并没有在'余烬方式'中考虑这个问题。希望有更好的方法来解决这个问题。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

这是我最终的结果。

在我的路线中,我写道:

export default Ember.Route.extend({
  //model is already loaded from parent route.
  setupController: function(controller, model){
    var modela = model; //just for clarity with the whole modela/modelb thing.
    modela.get('modelbs').forEach(function(modelb){
      $.ajax({
        //some ajax call using modelb's information.
      }).then(function(data){
        //extraInformation is not a model definted property on modelb, but I just added extraInformation as an index to modelb.
        modelb['extraInformation'] = data;
        controller.set('model', modela);
      });
    });
  }
});

然后在我的模板中写道:

{{#each modelb in modela.modelbs}}
  {{modelb.extraInformation}}
{{/each}}

希望这有助于某人。

答案 1 :(得分:0)

由于您拥有数据,您可以做的是,当您调用modelA或ModelB时,将somesorts的id作为参数附加到调用函数,并使用调用的回调返回该值。使用回调,您可以调用一个函数来找到将数据附加到的正确模型?

例如:

var objs = [
    {id:1, info: "hi", extraInfo: ""},
    {id:2, info: "bye", extraInfo: ""}
];

for(var i = 0; i < objs.length; i++){
    getRelatedInfo("extraInfo", objs[i].id);
}

function getRelatedInfo(someParam, 1){
    // call
    // on success
    attachInfoToObj(result, 1);
}
function attachInfoToObj(data, id){
    for(var i = 0; i < objs.length; i++){
        if(objs[i].id === id){
           objs[i].extraInfo = data;
        }
    }
}

答案 2 :(得分:0)

你可以在modela的afterModel钩子中获得modelb的信息。例如:

App.ModelaRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('modela', params.id);
  },
  afterModel: function(modela) {
    // Note: afterModel is called after modela is loaded

    // Iterate through modelbs
    modela.get('modelbs').foreach(function(modelb) {
      // Get current modelb's extra information by ajax. Note that this may result in *many* ajax requests - may be undesirable
      ajaxRequestForModelbInfo.done(function(response) {
        // Assign extra information to modelb's extraInformation property
        modelb.set('extraInformation', response);
      });
    });
  }
});

在hbs模板文件中:

{{#each modelb in modela.modelbs}}
  {{modelb.extraInformation}}
{{/each}}