0

私はこれをできるだけ明確に表現しようとしています。

フォームを表示するビューがあります。次のように、イベントハンドラーを送信ボタンに関連付けています。

events: {
    'click #bsubmit': 'save'
}

保存関数では、成功すると、移動する前にundelegateEvents()に注意します。

...
that.undelegateEvents();
window.router.navigate('#/home');
...

したがって、誰かがこのページにアクセスし、ページを送信してホームページに移動した場合(実際には:返送されます)、すべて問題ありません。

ただし、トップレベルのテンプレートの一部である「ホーム」リンクも表示されます。これは次のように指定されます。

<a href="#/home">Home</a>

したがって、誰かがこのページにアクセスし、ホームリンクをクリックして、(そこから)このページに戻ると、イベントが2回目にマップされます。これで、誰かがフォームを送信すると、2回送信されます。

私には多くのビューがあり、離れた場所へのナビゲーションはさまざまな方法で発生する可能性があることを考えると、ナビゲーションがより高い(制御できない)方法で発生する場合、undelegateEventsの一般的なパターンは何ですか?それとも私は根本的に間違ったことをしていますか?

4

1 に答える 1

0

あなたの場合、イベントの委任を解除する必要はありません。でDOMからフォームを削除するだけで$('el').remove()、javascriptイベントが自動的に削除されます

最善の解決策は、HomepageViewFormViewそれぞれを同じコンテナに入れることです(たとえば.container)。

完全なシナリオの例:

  • ユーザーは#homepageに移動し、インスタンス化しHomepageViewてレンダリングします.container
  • ユーザーは#formに移動し、インスタンス化しFormViewてレンダリングします.container
  • ユーザーは#homepageに移動し、インスタンス化しHomepageViewてレンダリングします.container
  • ...など

したがって、ユーザーが新しいルートに移動するたびに、前のビューが新しいビューに置き換えられます。

以前のビューのHTMLはDOMに属していないため、イベントの委任を解除する必要はありません。

もちろん、.container要素はビューに属していません。各ビューには、要素内にレンダリングされた独自の要素があり.containerます。

詳細については、このブログ投稿をお読みください。

于 2012-11-03T23:48:41.663 に答える