3

Backbone.jsを使用してアプリを作成していますが、非常に早い段階で修正できない問題が発生しました。

現在、簡単なリスト/詳細ビューの設定がありますが、詳細ビューをレンダリングするたびに、イベントが複合されます。たとえば、2つの詳細ビューを表示し、リンクをクリックすると、リンクが2回クリックされます。

私の見解は次のようになります(CoffeeScriptで書かれています):

#
# Project List View
#
class ProjectListView extends Backbone.View

  el: $("#projectList")

events : {
  "click #addProject" : "createNewProject"
}

initialize : ->
  @template = _.template(app.projectListView)
  _.bindAll(this, "render", "createNewProject")
  @render()

createNewProject : (e) ->
  e.preventDefault()
  e.stopPropagation()
  tempProject = Projects.create({
    title : 'Test Project'
    description : ''
    browserDefault : 12
    lineHeight : 21
  })

render : =>
  $(@el).html(@template())
  @delegateEvents()
  return @

明らかに、イベントが発生していて、クリックイベントが発生していません。ここで何が欠けていますか?

4

2 に答える 2

3

貼り付けたコードが正しくインデントされていないようです。もともとはそうだったのですか?

線は必要ありません_.bindAll。代わりに、 (の代わりに)=>メソッドを定義するために使用するだけです->

@delegateEventsジュリアンが提案したように、私はいくつかの文体の変更を行い、余分なものを取り除きました。これが機能するかどうかを確認します。

class ProjectListView extends Backbone.View

  el: $("#projectList")

  events:
    "click #addProject" : "createNewProject"

  initialize: =>
    @template = _.template(app.projectListView)
    @render()

  createNewProject: (e) =>
    e.preventDefault()
    e.stopPropagation()
    tempProject = Projects.create
      title: 'Test Project'
      description: ''
      browserDefault: 12
      lineHeight: 21

  render: =>
    @el.html @template()
    @
于 2011-02-16T19:16:11.413 に答える
2

これがあなたのコードについての私のコメントです。バックボーンは、イベントオプションに基づいて(delegateEventsを使用して)イベントを自動的に委任します。レンダリング関数でそれを行う必要はありません(おそらく、ダブルイベントがスローされる原因です)。レンダリングからdeleteEventsを削除します。

また、@ elはすでにjQueryオブジェクトとして定義されているため、レンダリング内で再度行う必要はありません。

2つのプロジェクトリストビューを作成しますか?その場合、IDは一意である必要があります...

于 2011-02-15T20:27:11.223 に答える