Как я могу добавить атрибут к событию JavaScript? - PullRequest
0 голосов
/ 16 февраля 2012

На уровне строки я ловлю событие и пытаюсь добавить дополнительный параметр

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

Как добавить атрибут к событию?

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Ответ таков: вы не перехватываете одно и то же событие, а скорее два (изначально) идентичных события. Изменение первого не меняет последнего.

Если вы хотите передать данные между этими событиями, вам нужно будет хранить эти данные в другом месте (например, закрытие или, если вам не нужна область, сохраните ее в объекте окна).

0 голосов
/ 16 февраля 2012

вместо того, чтобы перехватывать событие rowClick в главном представлении, я предлагаю вам перехватить его в представлении строк и пропустить через систему событий магистрали ... Ваше родительское представление может привязываться к его строкам, чтобы поймать клик.

есть два способа сделать это,

запускает пользовательское событие в модели вашей строки и позволяет родителю связываться с каждой моделью в коллекции, хотя это выглядит как взлом и снижение производительности.

Я предлагаю сделать это с помощью агрегатора событий:

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); 
  }

});
0 голосов
/ 16 февраля 2012

Есть два способа передачи данных в событие jQuery. Один с e.data, вы можете добавить любые свойства в e.data, как это.

http://www.barneyb.com/barneyblog/2009/04/10/jquery-bind-data/

другой способ заключается в использовании таких замыканий, как:

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

   var x = {
      onRowClick: function(e){
          console.log("Event in row");
          console.log(model) // prints 'test'
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...