Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 引发Backbone.js视图事件_Javascript_Backbone.js - Fatal编程技术网

Javascript 引发Backbone.js视图事件

Javascript 引发Backbone.js视图事件,javascript,backbone.js,Javascript,Backbone.js,我想找到一种方法,在不改变模型或dom的情况下引发backbone.js“事件” 例如,我正在异步加载Facebook SDK。我已订阅auth.login事件,并希望向我的视图发送一条消息,说明用户已登录,以便它可以适当地重新呈现自己 我的观点与此类似: window.CreateItemView = Backbone.View.extend({ el: $('#content'), initialize: function() { this.render(); },

我想找到一种方法,在不改变模型或dom的情况下引发backbone.js“事件”

例如,我正在异步加载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
  }
});
在我的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方法。我已经确保我的脚本以正确的顺序加载。奇怪的是,我在不同的页面上有相同的代码,尽管是不同的视图对象,但效果很好。我没有看到任何可以解释这一点的差异


一个更好的解决办法是提出某种事件,让观点倾听它。但是,我不想在模型上使用变更事件,因为signedRequest不应该是模型的属性。有没有更好的方法来实现这一点

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%确定您正确地实例化了该视图?而该
窗口.view
CreateItemView
的实例。

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

var SomeObject = {...};
_.extend(SomeObject, Backbone.Events);
然后,您可以订阅SomeObject上的事件

SomeObject.on('myevent', someFunc, this);
或者触发事件

SomeObject.trigger('myevent', data);

这里有一个
.trigger()
方法。您可以使视图侦听自定义事件,稍后将触发该事件。。。