2012-01-10 14 views
31

私は、ビューのevents属性によるBackboneの自動イベント委任を利用するTwitterブートストラップモードに基づいてBackbone.jsビューを作成しようとしています。Backbone.jsビューとしてのbootstrap-modalの使用

残念ながら、ブートストラップモーダルが、それはモーダルを表示する前にビューのHTMLをクローンとしてバックボーンのイベントの委任を破るようだ:

that.$element 
     .appendTo(document.body) 
     .show() 

マイビュー:

App.Views.ProjectsNav ||= {} 

class App.Views.ProjectsNav.NewProjectView extends Backbone.View 
    events: { 
    'click .save': 'save', 
    'shown':  'shown' 
    } 

    save: (e) -> 
    ... 
    false 

    shown:() -> 
    App.Helpers.Forms.setFocus($(@el), true) 
    false 

    render:() -> 
    $(@el).html(ich.nav_edit_project_template(@model.toJSON())) 
    @$('.modal').modal({'show': true, 'keyboard': true, 'backdrop': true}) 
    @ 

対応(口ひげ)HTMLテンプレート:

<div class="modal hide" style="display: none; "> 
    <div class="modal-header"> 
    <a href="#" class="close">×</a> 
    <h3>New Project</h3> 
    </div> 
    <div class="modal-body form-stacked"> 
    <label for="name">Name</label> <input type="text" name="name" value="{{name}}"/><input type="hidden" name="lock_version" value="{{lock_version}}"/> 
    </div> 
    <div class="modal-footer"> 
    <a href="javascript:void(0)" class="save btn primary">Create</a> 
    <a href="javascript:void(0)" class="cancel btn secondary">Cancel</a> 
    </div> 
</div> 

saveでもshownは、それぞれのイベントがトリガされたときに呼び出されます。

アイデア?

+0

HTMLでモーダルを埋めるために使用できる、ある種の「開かれた」コールバックがありますか?基本的にはクローニングをバイパスしてください(または少なくともクローズアップの部分は 'デリゲート'になっています)。 –

+0

はい、cf. http://twitter.github.com/bootstrap/1.4.0/bootstrap-modal.js。残念ながら、showイベントはクローンの前に呼び出されます(元の問題のために表示されたイベントが表示されません)。 –

+0

'shown'イベントはどうですか? "このイベントは、モーダルがユーザーに見えるようになったときに発生します(CSSの移行が完了するまで待機します)。 –

答えて

17

オールライト、その解決策はかなり簡単だったされています

物事をまとめる
App.Views.ProjectsNav ||= {} 

class App.Views.ProjectsNav.NewProjectView extends Backbone.View 
    tagName: 'div' 

    events: { 
    'click .save': 'save', 
    'click .cancel': 'hide', 
    'hidden':  'hidden', 
    'shown':   'shown' 
    } 

    initialize: (options) -> 
    super(options) 
    @collection = options.collection 

    hide:() -> 
    @el.modal(true).hide() 
    false 

    save: (e) -> 
    ... 
    @model.save(attrs, { 
     success: (project) => 
     @model = project 
     @collection.add(@model) 
     @hide() 
     error: (project) => 
     alert('Something went wrong: ' + project) 
     } 
    ) 
    false 

    render:() -> 
    @el = ich.nav_edit_project_template(@model.toJSON()).modal('keyboard': true, 'backdrop': true) 
    @delegateEvents() 
    @el.modal('show': true) 
    @ 

    hidden:() -> 
    @remove() 
    false 

    shown:() -> 
    App.Helpers.Forms.setFocus($(@el), true) 
    false 

、キーが@elを割り当て、それを可視化する前に、後で@delegateEvents()起動する可能性を与える2つのステップにモーダルを示す分割することです。 @el.modal(true)を使用して、モーダルを制御するオブジェクトへのアクセスを取得することができます。たとえば、プログラムで非表示にすることができます。

+1

私は追加しなければならなかったこれは$ el = $(this.el)です。 @delegateEvents()行の前に挿入します。 delegateEventsはthis.elの代わりにthis。$ elを使用しているようですが、この行を除いておそらく間違った要素を参照しています。 –

+1

私も$( "#myModal")を使用しなければなりませんでした。モーダルを隠す背景によってthis.modal(true).hide()が黒くなり、実際のダイアログがそのまま残ります。私はこれらの違いがテンプレートエンジンの違いによるものだと思います。私はJsViewsを使用しており、このようにモーダルを追加しています:this.el = $($ render $ "render" "myTemplate"(this.model.toJSON()))modal({...}); –

+0

JuhaPalomäki:Bootstrap 2を使用していると思いますが、これは上記の答えを書いたときにまだ開発中で、変更が必要です。私は私の答えをBootstrap 2のアプローチで拡張します... –

関連する問題