Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将属性附加到JavaScript事件?_Javascript_Jquery_Events_Backbone.js - Fatal编程技术网

如何将属性附加到JavaScript事件?

如何将属性附加到JavaScript事件?,javascript,jquery,events,backbone.js,Javascript,Jquery,Events,Backbone.js,在行级别,我捕获事件并尝试添加额外的参数 onRowClick: function(e){ console.log("Event in row"); e.model = "test"; console.log(e.model) // prints 'test' } 在主视图中,我再次捕捉到相同的事件 onRowClick: function(e){ console.log("Event in main view"); console.log(e.mode

在行级别,我捕获事件并尝试添加额外的参数

onRowClick: function(e){
    console.log("Event in row");
    e.model = "test";
    console.log(e.model) // prints 'test'
}
在主视图中,我再次捕捉到相同的事件

onRowClick: function(e){
    console.log("Event in main view");
    console.log(e.model) //prints undefined
}
控制台:

>Event in row
>test
>Event in main view
>undefined

如何将属性附加到事件?

我知道有两种方法可以将数据传递到jQuery事件。使用e.data,您可以像这样向e.data添加任何属性

另一种方法是使用闭包,例如:

function myFunc() {
   var model = 'test';      

   var x = {
      onRowClick: function(e){
          console.log("Event in row");
          console.log(model) // prints 'test'
      }
   }
}

答案是,您捕获的不是同一事件,而是两个(最初)相同的事件。改变前者并不能改变后者


如果要在这些事件之间传递数据,则需要将该数据存储在其他位置(例如,闭包,或者如果不关心作用域,请将其保存在窗口对象中)。

与其在主视图中捕捉rowClick事件,不如在row视图中捕捉它,并通过主干事件系统传递它。。。 您的parentview可以绑定到它的行以捕获单击

有两种方法可以做到这一点

在您所在行的模型上触发一个自定义事件,并让父对象绑定到集合中的每个模型,尽管这看起来像是一个黑客攻击和性能打击

我建议使用事件聚合器:

var App = {
  events: _.extend({}, Backbone.Events);
};

var myGeneralView = Backbone.Views.extend({

  initialize: function() {
    _.bindAll(this, "catchMyCustomEvent";

    /* 
      and here you bind to that event on the event aggregator and 
      tell it to execute your custom made function when it is triggered.

      You can name it any way you want, you can namespace 
      custom events with a prefix and a ':'.
    */
    App.events.bind('rowView:rowClicked'); 
  },

  catchMyCustomEvent: function (model, e) {
    alert("this is the model that was clicked: " + model.get("myproperty"));
  }

  // other methods you will probably have here...
});

var myRowView = Backbone.Views.extend({

  tagName: "li",

  className: "document-row",

  events: {
    "click" : "myRowClicked"
  },

  initialize: function() {
    _.bindAll(this, "myRowClicked");
  },

  myRowClicked: function (e) {

    /*
      You pass your model and your event to the event aggregator
    */
    App.events.trigger('rowView:rowClicked', this.model, e); 
  }

});

您是否尝试过
e.data.model