Воспроизведение Backbone.js Просмотр события - программирование
Подтвердить что ты не робот

Воспроизведение Backbone.js Просмотр события

Я хотел бы найти способ поднять backbone.js "событие" без изменения в модели или в dom.

Например, я загружаю SDK Facebook асинхронно. Я подписался на событие auth.login и хотел бы отправить сообщение на мое мнение, что пользователь вошел в систему, чтобы он мог повторно отобразить его соответствующим образом.

Мой вид выглядит примерно так:

window.CreateItemView = Backbone.View.extend({
  el: $('#content'),
  initialize: function() {
    this.render();
  },
  render: function() {
    // do something
    return this;
  },
  setSignedRequest: function(signedRequest) {
    //do something with signedRequest
  }
});

В моем коде facebook я делаю это:

  FB.Event.subscribe('auth.login', function(response){
    if (response.status === 'connected') {
      var uid = response.authResponse.userID;
      var accessToken = response.authResponse.accessToken;
      window.signedRequest = response.authResponse.signedRequest;

      if (window.view && window.view.setSignedRequest) {
          window.view.setSignedRequest(window.signedRequest);
      }
    }
  });

Однако, хотя window.view существует, он не может видеть метод setSignedRequest. Я гарантировал, что мои скрипты загружаются в правильном порядке. Странно, что у меня есть тот же код на другой странице, хотя и у другого объекта View, и он отлично работает. Я не видел никакой разницы, которая могла бы объяснить это.

Лучшим решением было бы поднять какое-то событие и послушать его. Однако я не хочу использовать событие изменения для модели, поскольку signedRequest не должен быть свойством модели. Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Backbone.View расширяется с помощью Backbone.Events, что означает, что вы можете легко запускать пользовательские события и передавать любые нужные вам данные.

var View = Backbone.View.extend({

    initialize: function() {

        this.on('customEvent', this.doSomething, this);
    }

    doSomething: function(someData) {

        // this!
    }
});

var view = new View();

view.trigger('customEvent', "someDataHere");

хотя я не знаю, почему вы не можете увидеть метод в представлении - он должен работать. Вы на 100% уверены, что правильно создаете представление? и что window.view является экземпляром CreateItemView?

Ответ 2

Если вы хотите сделать это за пределами своей модели и подписаться на мероприятие в своем представлении, вы можете сделать следующее:

var SomeObject = {...};
_.extend(SomeObject, Backbone.Events);

Затем вы можете подписаться на события в SomeObject

SomeObject.on('myevent', someFunc, this);

или вызвать событие

SomeObject.trigger('myevent', data);