提升Backbone.js查看事件

Jam*_*mes 17 javascript backbone.js

我想找到一种方法来提高backbone.js"event",而不会在模型或dom中发生任何变化.

例如,我正在异步加载Facebook SDK.我订阅了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
  }
});
Run Code Online (Sandbox Code Playgroud)

在我的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);
      }
    }
  });
Run Code Online (Sandbox Code Playgroud)

但是,当window.view存在时,它无法看到setSignedRequest方法.我确保我的脚本按正确的顺序加载.奇怪的是,我在不同的页面上有相同的代码,尽管是一个不同的View对象,它工作正常.我没有看到任何可以解释这一点的差异.

一个更好的解决方案是提出某种事件并让视图听取它.但是,我不想在模型上使用change事件,因为signedRequest不应该是模型的属性.有没有更好的方法来实现这一目标?

Tom*_* Tu 28

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");
Run Code Online (Sandbox Code Playgroud)

虽然我不知道为什么你看不到视图上的方法 - 它应该工作 - 你是100%确定你正确地实例化视图?那window.view是实例CreateItemView


ggo*_*zad 10

如果您想在模型之外执行此操作并在视图上订阅该事件,则可以执行以下操作:

var SomeObject = {...};
_.extend(SomeObject, Backbone.Events);
Run Code Online (Sandbox Code Playgroud)

然后,您可以订阅SomeObject上的事件

SomeObject.on('myevent', someFunc, this);
Run Code Online (Sandbox Code Playgroud)

或触发事件

SomeObject.trigger('myevent', data);
Run Code Online (Sandbox Code Playgroud)