如何让Ember.js在显示视图之前加载RESTAdapter数据?

时间:2013-07-31 11:20:01

标签: javascript rest ember.js

我有一个使用RestAdapter的应用程序,它从服务器获取适当的数据:

App.AFile= DS.Model.extend({
  name: DS.attr( 'string' ),
...

App.Store = DS.Store.extend({
  revision: 13,
  adapter: DS.RESTAdapter.extend({url: "myapi"})
});

这样的地图:

App.Router.map(function() {
  this.resource('allfiles', { path: '/allfiles' });
  this.resource('onefile', {path: '/onefile/:onefile_id' });

和这样定义的路线:

App.allfilesRoute = Ember.Route.extend({
  model: function()
  {
      return App.AFile.find();
  }
});

App.onefileRoute = Ember.Route.extend({
  model : function(params)
  {
      return App.AFile.find(params.onefile_id);
  }
});

这些模板:

 <script type="text/x-handlebars" data-template-name="allfiles">
 {{#each controller}}
    {{#linkTo onefile this}}open{{/linkTo}}
 {{/each}}
 </script>

 <script type="text/x-handlebars" data-template-name="onefile">
   {{name}}
 </script>

它的工作方式如下:用户打开应用程序并显示所有文件模板,其中包含一个名为open的链接。该链接打开一个名为onefile的模板,并将onefile_id传递给它。

当我打开应用程序并单击打开时,它会工作并显示一个文件的正确名称。 URL设置为#/ onefile / 1,其中1是onefile_id。所以它运作正常。

但是当我刷新页面(#/ onefile / 1)时,名称不再显示了。

在我返回id之前,我已经检查了正在进行的操作以及onefileRoute模型函数,并且App.AFile对于定义的所有字段都具有空值。在app加载后,这些值在App.AFile对象中正确填充,但不会显示在视图上。

所以看起来RestAdapter在视图显示后获取数据。

如何让它发挥作用?

1 个答案:

答案 0 :(得分:0)

App.onefileRoute = Ember.Route.extend({
  model : function(params)
  {
      var m = App.AFile.find(params.onefile_id);
      // at this point m might not be resolved, so name could be empty
      return m;
  },
  afterModel: function(model, transition){
      // at this point it should be resolved, what happens here?
      console.log(model.get('name'));
  }
});

我的猜测是你的端点正在通过id为模型返回错误的信息。