Огневые события в JavaScript - PullRequest
2 голосов
/ 13 марта 2012

У меня есть класс JavaScript с именем «Item». «Элемент» определяется как показано здесь:

function Item() { this.create(); }
Item.prototype = {
  create: function () {
    this.data = {
      id: getNewID(),
    }
  },

  save: function() {
    $.ajax({
      url: getBackendUrl(),
      type: "POST",
      data: JSON.stringify(this.data),
      contentType: "application/json",
      success: save_Succeeded,
      error: save_Failed
    });
  },

  function save_Succeeded(result) {
    // Signal an event here that other JavaScript code can subscribe to.
  }

  function save_Failed(e1, e2, e3) {
    // Signal an event here that other JavaScript code can subscript to.
  }
}

Пожалуйста, обратите внимание, я из C # фона. Так что я даже не уверен, возможно ли то, чего я хочу достичь. Но по сути я хочу создать объект, подписаться на некоторые обработчики событий и попытаться сохранить мой объект. Например, я предполагаю сделать что-то вроде следующего в моем коде.

var i = new Item();
i.item_save_succeeded = function() {
  // Do stuff when the item has successfully saved
};
i.item_save_failed = function() {
  // Do stuff when the item has failed to save
};
i.save();  // start the save process

Возможен ли такой подход на основе событий в JavaScript? Если так, то как? Что мне не хватает? Я продолжаю получать множество неопределенных ошибок. Из-за этого я не уверен, что подхожу ближе или дальше.

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Если вы используете jQuery, вы можете добавить обработчик события к пользовательскому типу события. Следующий фрагмент взят из документации jQuery

$('#foo').bind('custom', function(event, param1, param2) {
  alert(param1 + "\n" + param2);
});
$('#foo').trigger('custom', ['Custom', 'Event']);

Но так как jQuery 1.7 устарел bind, вы должны использовать on сейчас. См. Документацию jQuery для .

.
0 голосов
/ 13 марта 2012

Не уверен на 100%, и я с нетерпением жду ответа от JS pro, но вот что я хотел бы сделать.

Предоставить некоторые свойства внутри вашего объекта Item - а именно функции, на которые вы хотите подписатьсяк.

После создания элемента вы можете предоставить функции обратного вызова для событий, о которых вы хотите получать уведомления.Затем в своем коде вы можете сделать что-то вроде этого:

    save: function() {
var self = this;    
$.ajax({
      url: getBackendUrl(),
      type: "POST",
      data: JSON.stringify(this.data),
      contentType: "application/json",
      success: function() { if(typeof(self.success) == "function") self.success(); }
      error: function() { if(typeof(self.fail) == "function") self.fail(); }
    });
  },

По сути, передать функции обратного вызова объекту и позволить ему вызывать их напрямую при необходимости.Я уверен, что кто-то сейчас предложит лучший способ сделать это.: -)

...