web-dev-qa-db-ja.com

Ember Dataを使用したモデルの再読み込み

文書化された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

リロードでこのエラーが発生する理由がよくわかりません。何かアドバイスをいただければ幸いです。

ありがとう

8
Chris

modelはEmber.Routeのフックとしてすでに存在しているため、プロパティとして取得することはできません。

代わりに、次のことができます。

_this.modelFor('video').reload();
_

技術的にはthis.get('currentModel').reload();も実行できますが、これは文書化されておらず、将来的には利用できなくなる可能性があります。

13
Christoffer P.

ルートのrefreshメソッドは、あなたが求めていることを実行します

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

  actions: {
    reloadModel: function() {
      this.refresh()
    }
  }
});

APIドキュメント

14
anthonygore

ルートモデル関数 は、コントローラーデータをロードするためのフックを提供します。 残り火ガイド に特定のセクションがあります。

1)コンテンツにアクセスする場合は、次のようになります。

reload: function() {

  this.controller.get('content');

}

2)reloadは、ember-dataオブジェクトで使用できるメソッドです。あなたの例では、jsオブジェクトをロードしています({id:2、title: "Test video title 2"、status: "downloading"})。

0
ppcano