0

バックボーン ビューの 1 つに次のコードがあります。

class GD.Views.Result extends Backbone.View
  template: JST['mobile/templates/result']
  tagName: 'tr'
  className: 'result'
  events:
    'click' : 'showDetail'
    'click #favourite' : 'addFavourite(Favourite)'
    'click #like' : 'addFavourite(Like)'
    'click #dislike' : 'addFavourite(Dislike)'
   render: ->
     $(@el).html(@template(model: @model))
     this
   addFavourite: (type) ->
     event.preventDefault()
     attributes =
       id: @model.id
       type: type
       cluster: @model.cluster
     @collection.create attributes,
     wait: true
     success: @updateIcons
     error: @handleError
   showDetail: ->
     ...
   updateIcons: ->
     ...
   handleError: ->
     ...

そして、コンソールに次のエラーが表示されます。

Uncaught Error: Method "addFavourite(Favourite)" does not exist

これが showDetail メソッドではなく AddFavourite メソッドで発生する理由がよくわかりません。定義済みの引数を必要とするメソッドをイベントに渡すことは許可されていませんか?

助けてくれてありがとう(!)

4

2 に答える 2

4

@Derickが説明したように、events要素の値が文字列の場合、ビューオブジェクトのメソッドに名前が付けられるため、そのようにパラメーターを指定することはできません. 次のいずれかを行う必要があります (例は JS にあります)。

  1. メソッド名だけを文字列として指定し、メソッドの型を決定します。例えば

    events : {
    
      'click #favourite' : 'addFavourite',
    
      'click #like' : 'addFavourite',
    
      'click #dislike' : 'addFavourite'
    
    }
    

    addFavourite : function ( event ) {
    
      event.preventDefault();
    
      var type = event.target.id;
    
    }
    
  2. 関数オブジェクトを提供します (この例では、関数式を介して)。この場合、ジェネリックaddFavoriteメソッドを呼び出して型を渡す関数を指定できます。

    events : {
    
      'click #favourite' : function ( event ) {
    
        this.addFavourite( event, 'favourite' );
    
      },
    
    
      'click #like' : function ( event ) {
    
        this.addFavourite( event, 'like' );
    
      },
    
    
      'click #dislike' : function ( event ) {
    
        this.addFavourite( event, 'dislike' );
    
      }
    
    }
    

    addFavourite : function ( event, type ) {
    
      event.preventDefault();
    
    }
    

あなたの例でわかることから、オプション#1を使用します。

これはより動的にすることができることに注意してください。

events : function () {

  var events = {};

  var view = this;

  [

    'favourite',

    'like',

    'dislike'

  ].forEach( function ( type ) {

    events[ "click #" + type ] = ( function ( type ) {

      return function ( event ) {

        view.addFavourite( event, type );

      };

    } )( type );

  };


  return events;

}    
于 2012-04-30T14:32:03.893 に答える
1

イベント構成でパラメーターを指定しないでください。イベント構成はルックアップとして使用され、メソッドのシグネチャではなく名前で実行されます。

class GD.Views.Result extends Backbone.View
  template: JST['mobile/templates/result']
  tagName: 'tr'
  className: 'result'
  events:
    'click' : 'showDetail'
    'click #favourite' : 'addFavourite'
    'click #like' : 'addFavourite'
    'click #dislike' : 'addFavourite'
   render: ->
     $(@el).html(@template(model: @model))
     this
   addFavourite: (type) ->
     event.preventDefault()
     attributes =
       id: @model.id
       type: type
       cluster: @model.cluster
     @collection.create attributes,
     wait: true
     success: @updateIcons
     error: @handleError
   showDetail: ->
     ...
   updateIcons: ->
     ...
   handleError: ->
     ...
于 2012-04-30T14:00:32.163 に答える