すでにEmberのモーダルについて質問する質問がたくさんあります(this oneとthis 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
モデルの 'save'が解決したときに解決する約束を返すコントローラで' save' **メソッド**を呼び出すことで、 'save'アクションをビューに向けてターゲットにしましたか?コントローラはモデル節約ロジックを抽象化し、約束が解決されたときにビューに通知されます。 – edpaez
コメントありがとうございます。私の編集を参照してください。 – Feech
アクションハンドラの戻り値は、バブリングに使用されます。また、使用しているsendメソッドは何も返しません。メソッドを直接呼び出す必要があります(アクションハッシュの中に入れないでください)。ビューでは: '@get( 'controller')。save()。then ... ' – edpaez