2

レンダリングに渡される引数に応じて、リストを編集するためのフォームまたはリスト自体をレンダリングする Form というビューがあります。表示/編集モードを切り替えることができるように、イベント ハンドラーを追加しました。簡単にするために、以下のコードからこれを取り出しましたが、これはビューがコンテキストで何をするかについて少しコンテキストを提供するだけです。

このフォーム ビューを、フォームまたはリストをレンダリングする必要がある別のビューの子としてインスタンス化できます。これは、フォームとしてレンダリングされる新しいビューで実行しました。

保存する必要があるときは、form:save イベントを呼び出します。これにより、フォームを保存する Form ビューでルーチンがトリガーされます。ここでは、console.log を呼び出して、動作することを示しています。私のコードでは、ApplicationView によって挿入されたナビゲーション ボタンにバインドする $('a#submit').click バインディングを介して form:save を呼び出します (ただし、この質問の目的には関係ないと思います)。

新しいビューから離れて、何度も戻ったとしましょう。保存を押すと、新しいフォーム ビューをインスタンス化してレンダリングした回数だけメソッドが実行されます。

ここのところ:

私は、フォームビューのクローズメソッドで、新しいビューから unbind() と remove() を実行しようとしましたが、うまくいきませんでした。

スコーピングに問題があるかもしれないと思いますが、よくわかりません。

これは私のナビゲーション バインディングとは関係ありません。

これはゾンビビューに関係していると思います。

一度だけ実行するためのポインタはありますか?

App.Views.New = Support.CompositeView.extend
initialize: (options) ->
    _.bindAll this, 'render'
    @model = new App.Models.Item()

render: ->
    self = this

    form = new App.Views.Form model: @model, collection: @collection

    @$el.append form.render().el

    setTimeout (->
        $('a#submit').click (e) ->
            e.preventDefault()
            App.eventHandler.trigger 'form:save'
    ), 0
    this

App.Views.Form = Support.CompositeView.extend
initialize: ->
    _.bindAll this, 'render', 'save'

    App.eventHandler.on 'form:save', @save

render: ->
    self = this
    # RENDER TEMPLATE HERE
    this

save: ->
    console.log 'form saved'
4

1 に答える 1

4

あなたの問題は、フォームをレンダリングするたびに新しいビューを作成していることだと思いますが、古いビューを削除していません。できることは、古いビューを破棄するか、それへの参照を保持し、毎回新しいビューを作成する代わりに、モデルを既存のビューに渡し、表示を更新/再レンダリングすることです

于 2012-07-23T14:56:55.703 に答える