【问题标题】:Model reloading with Ember Data使用 Ember 数据重新加载模型
【发布时间】:2014-04-29 18:51:16
【问题描述】:

我正在尝试使用记录在案的 model.reload() 函数来轮询更多数据

App.ModelViewRoute = Ember.Route.extend({
  actions: {
    reload: function() {
      this.get('model').reload();
    }
  }
});

但我收到一条错误消息说...

undefined is not a function TypeError: undefined is not a function

有没有更好的方法呢,好像不能从路由中以这种方式访问​​模型?

这是路由器

App.Router.map(function() {
  this.route('video', { path: '/videos/:video_id' });
});

这是路线

App.VideoRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('video', params.video_id);
  },

  actions: {
    reloadModel: function() {
      // PROBLEM HERE
      // this.get('model').reload();
      Ember.Logger.log('reload called!');
    }
  }
});

这是模型

App.Video = DS.Model.extend({
   title: DS.attr('string'),
   status: DS.attr('string')
});

还有模板

<script type="text/x-handlebars" data-template-name="application">
  <h1>Testing model reloading</h1>
  {{#link-to "video" 1}}view problem{{/link-to}}
  {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="video">
  <h1>Video</h1>
  <h2>{{title}}</h2>
  {{model.status}}
  <p><button {{action 'reloadModel'}}>Reload model</button></p>
</script>

我在这里制作了这个问题的 jsbin:

http://jsbin.com/wofaj/13/edit?html,js,output

我真的不明白为什么重新加载会给我这个错误。任何建议将不胜感激。

谢谢

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    由于 model 已作为 Ember.Route 上的钩子存在,因此您无法将其作为属性获取。

    相反,您可以执行以下操作:

    this.modelFor('video').reload();
    

    从技术上讲,您也可以使用 this.get('currentModel').reload();,但这是未记录的,将来可能不会提供。

    【讨论】:

    • 函数reload()不存在了吗?我收到错误this.modelFor(...).reload is not a function
    • modelFor 是 Route 类的一个方法,但在这种情况下与 OP 询问的内容无关
    【解决方案2】:

    路由的refresh 方法可以满足您的需求

    App.VideoRoute = Ember.Route.extend({
      model: function(params) {
        return this.store.find('video', params.video_id);
      },
    
      actions: {
        reloadModel: function() {
          this.refresh()
        }
      }
    });
    

    API docs

    【讨论】:

      【解决方案3】:

      route model function 提供了一个挂钩来加载您的控制器数据。在ember guide 有一个特定的部分。

      1) 如果你想访问你的内容,它会是这样的:

      reload: function() {
      
        this.controller.get('content');
      
      }
      

      2) reload 是一种可用于 ember-data 对象的方法。在您的示例中,您正在加载一个 js 对象({ id:2, title:"Test video title 2", status:"downloading"})。

      【讨论】:

      • 嗨 ppcano - 感谢您的回复。也许我做的 JSBin 过于简单和混乱。我为服务器响应模拟的 JS 对象实际上并没有发生什么,它使用 Ember Data 从 API 端点重新加载最新数据。我只是想让它真正进行 API 调用。
      猜你喜欢
      • 1970-01-01
      • 2018-02-26
      • 2014-06-10
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多