2016-08-07 4 views
0

私は今非常に簡単な設定をしています。私は名前と著者を持つ本モデルを持っています。私は新しい本を作成する簡単なフォームを作成しようとしています。著者のために私は著者のモデルから著者を読み込むために力の選択を使用しています。フォームの設定は次のようになります。ember - パワーソートのルートでモデルデータをロードしていますか?

<form {{action "save" on="submit"}}> 
    {{input value=model.title placeholder="Title"}}<br> 

    {{#power-select class="select" 
     selected=model.author 
     options=authors 
     onchange=(action (mut model.author)) as |author|}} 
     {{author.name}} 
    {{/power-select}} 

    <input type="submit" value="Save"> 
</form> 

しかし、私はこの作業を行うために経路を設定する際に問題があります。私のデータベースに著者が登録されているにもかかわらず、選択肢に著者が現れていません。私のルートは次のようになります:

まず最初に、書籍/新しいルートのルートで著者モデルからデータを正しく読み込むべきですか?第二に、私はルートでこれをやっていますか?私が読んだこと、そして人々が私に語ったことから、モデルデータの読み込みはそのルートで行われるべきです。

答えて

0

authorsプロパティを対応するコントローラに移動します。

また、readonlyを追加する必要はありません。コントローラ中のSO

authors: Ember.computed(function(){ 
       return this.get('store').findAll('author');   
}) 

そしてルートでロードモデル用。はい、ルート上で操作するリソースになるモデルをロードする必要があります。だから、あなたはそれを正しくやっている。

+0

私は見るので、そのルートのモデルデータを読み込むためのルートを使用してください。しかし、他のモデルからデータをロードする場合は、コントローラを使用しますか? – PCR

+0

@PCR No. 'Ember.RSVP.hash'を使って' model'フックルートに 'authors'をロードすることもできます。しかし、「著者」はあなたのルートが扱うリソースではありません。私は経路があなたの事例の中の資源を管理する責任があることを意味します。著者は選択ボックスのコレクションに過ぎず、フォーム内では変更されません。これが役に立ったらいいですね。 –

0

1)あなたのルートファイル - ルートモデルフックの内側Ember.RSVP.hash

の使用>私は本を想定/ new.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model() { 
     return Ember.RSVP.hash({ 
      newBook : this.store.createRecord('book'), 
      authors : this.store.findAll('author')   
     }); 
    }, 
    actions: { 
     save() { 
      this.modelFor(this.routeName).newBook.save(); 
     } 
    }  
}); 

およびテンプレート内で、あなたはmodel.authorsを使用してauthorsにアクセスすることができます。そして、著者モデルデータとしてエブラヒムが提案のように、あなたが必要なコントローラで以下のコードを持つことができmodel.newBook.title

<form {{action "save" on="submit"}}> 
    {{input value=model.newBook.title placeholder="Title"}}<br> 

    {{#power-select class="select" 
     selected=model.newBook.author 
     options=model.authors 
     onchange=(action (mut model.newBook.author)) as |author|}} 
     {{author.name}} 
    {{/power-select}} 

    <input type="submit" value="Save"> 
</form> 

2を使用することによりtitle)、

authors: Ember.computed(function(){ 
      return this.store.findAll('author');   
}) 

3)は著者のためのデータモデルを共有しようとしています、本、本。新しいルート。サービスを継続して、必要なすべてのルートからアクセスできます。

著者-service.js - >サービス

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    store:Ember.inject.service(), 
    authors: undefined, 
    init(){ 
    this._super(...arguments); 
    this.get('store').findAll('author', { reload: true }).then(function(results){ 
     this.set('authors',results); //As this is going to be Ember.enumerables, you can iterate and get the data. 
    }); 
} 
}); 

であなたはそれを authorsService:Ember.inject.service()を注入することにより、任意の場所にauthors-service.jsからauthorsにアクセスすることができます。私はあなたのケースでは、あなたがbooks/new.hbsテンプレート、

冊/ new.js用コントローラbooks/new.jsを作成する必要があると思います - >コントローラファイル

ブック/新しいインサイド
import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    authorsService:Ember.inject.service(), 
    authors: Ember.computed.alias('authorsService.authors'); 
}); 

。hbsテンプレートauthorsプロパティにアクセスすることができます。

+0

ね、this.modelFor(this.routeName).get( 'newBook')を使ってみました。 '私のルートファイルでは、私のコンソールでエラー' this.modelFor(...)を返します。getは関数ではありません。 ' – PCR

+0

ああ、申し訳ありませんが、this.modelFor(this.routeName).newBookのようにアクセスできます。セーブ()。 RSVPハッシュがEmberオブジェクトを返さないため、私は自分の答えを更新しました – kumkanillam

関連する問題