2013-12-23 14 views
5

すでにEmberのモーダルについて質問する質問がたくさんあります(this onethis oneなど)。モーダルを使用する方法について説明しているcookbook has an articleでも、モーダル内のサーバーからの検証が必要なこれらのカバーフォームの提出(つまり、すでに使用されているユーザー名)はありません。Emberのブートストラップモーダル内のフォームのレンダリング

調理師の説明書に続いて、アプリケーションテンプレートに名前付きのアウトレットがあります。

{{outlet}} 
{{outlet modal}} 

また、(ブートストラップを使用して)モーダルアウトレット内でテンプレートをレンダリングするアクション。

App.ApplicationRoute = Ember.Route.extend 

    actions: 
    openModal: (template, model) -> 
     @controllerFor(template).set('model', model) 
     @render template, into: 'application', outlet: 'modal' 

    closeModal: -> 
     @render '', into: 'application', outlet: 'modal' 

明らかに、私はリンク内からこのアクションを呼び出しています。

<a href="#" {{action openModal "person.edit" model}}>Edit</a> 

ここで、modelは、現在のルートのモデルです。

私はdidInsertElementにフックを入れ、ブートストラップモーダルを有効にします。このフックの中で、クローズボタンをクリックしてモーダルアウトレットをクリアすると、ブートストラップによって起動されるhidden.bs.modalイベントも聞きます。

App.PersonEditView = Ember.View.extend 

    didInsertElement: -> 
    @$('.modal').modal('show').on 'hidden.bs.modal', => 
     @get('controller').send('closeModal') 

私の質問は、私はそれがサーバー上で検証した後(ブートストラップのアニメーションを使用して)モーダルを閉じますsaveアクションを定義する方法、ありますか?表示されるイベントのシーケンスは、1)saveがコントローラでトリガされる、2)保存に成功した場合は、モーダルを閉じます(ビューから​​を呼び出す必要があります)。

Emberのエキスパートがここで示唆していることはわかりません。ビューとコントローラーが非常に緊密にコミュニケーションする必要があるようです。

ありがとうございます! edpaezさんのコメントに応えて


EDIT

、私は、ビュー内からsaveによって返された約束を解決しようとしています。例えば、私のテンプレート

<button type="button" class="btn btn-primary" {{action "save" target="view"}}>Save</button> 

ビュー

App.PersonEditView = Ember.View.extend 
    actions: 
    save: -> 
     @get('controller').send('save').then(@closeModal.bind(@)) 

    closeModal: -> 
    @$('.modal').modal('hide') 

    # the rest omitted for brevity 

そして

App.PersonEditController = Ember.ObjectController.extend 
    actions: 
    save: -> 
     @get('model').save() 

は、私は次のエラーを取得するコントローラで

Uncaught TypeError: Cannot call method 'then' of undefined 
+0

モデルの 'save'が解決したときに解決する約束を返すコントローラで' save' **メソッド**を呼び出すことで、 'save'アクションをビューに向けてターゲットにしましたか?コントローラはモデル節約ロジックを抽象化し、約束が解決されたときにビューに通知されます。 – edpaez

+0

コメントありがとうございます。私の編集を参照してください。 – Feech

+0

アクションハンドラの戻り値は、バブリングに使用されます。また、使用しているsendメソッドは何も返しません。メソッドを直接呼び出す必要があります(アクションハッシュの中に入れないでください)。ビューでは: '@get( 'controller')。save()。then ... ' – edpaez

答えて

1

saveアクションをターゲットにしてください表示:

<button type="button" class="btn btn-primary" {{action "save" target="view"}}>Save</button> 

を呼び出し、コントローラでsaveメソッドを呼び出します。このメソッドは、モデルのsaveメソッドが解決されたときに解決される約束を返します。

App.PersonEditView = Ember.View.extend 
    actions: 
    save: -> 
     @get('controller').save().then(@closeModal.bind(@)) 

    closeModal: -> 
    @$('.modal').modal('hide') 


App.PersonEditController = Ember.ObjectController.extend 
    save: -> 
     @get('model').save() 

この方法では、コントローラは、モデルの保存ロジックを抽象化モデルが期待どおりに振る舞うことができるので、保存するときにビューが通知されます。

アクションを送信する代わりにコントローラでsaveメソッドを呼び出すことを確認してください。 sendメソッドは何も返しません。

希望すると助かります!

+0

このモーダル機能をコンポーネントにラップして、編集ルートに再利用する方法はありますか?コンポーネントから送信するアクション( '{{my-component save =" save "...}}')のみを指定し、コンポーネントで 'sendAction()'を使用することができます。私はコントローラ上のメソッドを直接呼び出すことはできません。 – Feech

+0

約束事で 'closeModal'をラップし、' sendAction'で送信してください。次に、保存が成功すると、約束を解決してモーダルを隠すことができます。 'save'が失敗した場合(フォームの検証など)、約束を拒否することができます。 http://stackoverflow.com/a/20810854/306503を参照してください。 –

関連する問題