backbone.js: понимание обработки событий браузера и удаление представлений - PullRequest
4 голосов
/ 21 марта 2011

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

App.Views.Addresses         = App.Views.Addresses || {};
App.Views.Addresses.Address = Backbone.View.extend({

  events: {
    "click button#foo"             : "clear"
  },

  initialize: function(model){
                this.address = model.model;
                this.address.view = this;
                _.extend(this, Backbone.Events);
                this.render();
              },

  render:     function(){
                ... rendering stuff
              },

  clear:      function(){
                this.address.clear();
              }
});

и

var Address = Backbone.Model.extend({

  url:   function() {
           ... url stuff
         },

  clear: function(){
           this.destroy();
           this.view.remove();
         }
});

Здесь я сталкиваюсь с двумя проблемами.Первый:

У меня есть кнопка с id = "foo" в моем источнике, и я хочу, чтобы представление ловило событие "click" этой самой кнопки и запускало событие "clear".Проблема: это не работает.

В любом случае, вызов «clear» на моей модели вручную удаляет данные на сервере, но не удаляет само представление.Это вторая проблема.Надеюсь, кто-то более опытный сможет просветить меня.

Заранее Феликс

1 Ответ

11 голосов
/ 21 марта 2011

Первая проблема:

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

Вторая проблема:

  • Использование событий для уничтожения вашего вида
    • Не следует сохранять вид в модели.Это своего рода «нет нет» в MVC.Ваша модель уже выдает событие "удалить" при удалении.Ваше представление должно слушать его и вести себя соответственно.
  • Вы должны удалить свой элемент представления из DOM самостоятельно
    • Это не обрабатывается магистралью.

Другие общие комментарии:

  • Представления уже расширяются Backbone.Events
  • Используйте this.model вместо this.address
...