0

对于我的一个主干视图,我有以下代码:

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

我真的不明白为什么 AddFavourite 方法而不是 showDetail 方法会发生这种情况 - 您是否不允许将需要定义参数的方法传递给任何事件?

非常感谢您的任何帮助(!)

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 回答