更改模型中未受影响的模型

时间:2014-08-15 10:26:26

标签: javascript ember.js

我尝试像这样手动添加数据模型

beforeModel: function() {
    var scope =this;
    Ember.$.getJSON('/restURL').then(function(response){
                    scope.store.pushPayload('consultation',response);
},

并且数据已成功加载,我可以在ember调试器中看到它,但是我遇到了问题 - 数据不在视图上呈现。

application.hbs中的

模板:

{{#each item in model}}
           {{#link-to 'consultation' item}}{{item.remoteUser.name}}{{/link-to}}
{{/each}}

注意:当我使用this.store.find('consultation');加载数据时,它工作正常,但我有自定义网址,无法使用此结构。

2 个答案:

答案 0 :(得分:2)

据我了解,您希望使用直接ajax调用加载咨询。你现在的方式是,在beforeModel中检索协商,然后,由于你没有返回承诺,Ember立即继续执行model挂钩之前 ajax调用完成。模型挂钩中的this.store.find可能会向服务器发出另一个可能无效的请求。最简单的方法就是

model: function() {
  var store = this.store;

  return Ember.$.getJSON('/restURL')
    .then(function(response) {
      store.pushPayload('consultation', response);
      return store.all('consultation');
    });
}

请注意store.all的使用,beforeModel是商店中已存在的所有该类型对象的动态集合。

您还可以考虑将逻辑分为modelbeforeModel: function() { return Ember.$.getJSON('/restURL') // this binding style is a matter of personal preference :-) .then(this.store.pushPayload.bind(this.store, 'consultation')) }, model: function() { return this.store.all('consultation'); } ,如下所示:

{{1}}

答案 1 :(得分:0)

您应该使用afterModel挂钩而不是beforeModel,因为beforeModel不用于数据聚合。 beforeModel在模型尝试解析之前发生,它无法访问已解析的模型,因此您无法依赖它来向模型添加额外数据。

另一方面,afterModel hook会将解析后的模型作为第一个参数传递,因此您可以根据需要进一步修饰模型,并且可以像model一样返回一个承诺钩。

看看这个简单的例子:http://emberjs.jsbin.com/nukebe/1