Backbone.js /解析事件范围

r6vfmomb  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(167)

我正在触发一个自定义事件,但找不到从另一个文件将操作绑定到该事件的方法。我猜这是一个范围问题,但我无法单独解决它。
在我的应用入口文件中,我触发了一个自定义的boom事件,如下所示:

var page_object_test = {};
  _.extend(page_object_test, Parse.Events);
  page_object_test.trigger("boom");

这段代码包含在一个jQuery $(document).ready()语句中。
然后,从另一个文件中的jQuery插件heild中,并将其包含在(function($) {})(jQuery);结构中,我想将某个函数绑定到我的boom事件,但什么也没发生:

var page_object = {
    update_page_title : function(route, params) {
      var new_title = "";

      switch(route) {
        default: 
          new_title = "La meilleure façon d'emmener vos enfants à l'école";
      }

      document.title.html(new_title);
    } 
};

  _.extend(page_object, Parse.Events);

  page_object.on("boom", function() {console.log(".on() binding is working!")});

为什么我不能从另一个文件接收这个事件?我意识到我不明白 Backbone.js 事件是如何冒出来的。除了正确的写作方式,我真的很想被指出对这些事件的范围的清晰解释。
欢迎任何解释

osh3o9ms

osh3o9ms1#

您的范围有问题:page_object_test必须在您希望它侦听的另一个文件中已知。
对于 Backbone.js 事件,不存在事件冒泡这样的事情。
四种解决方案:
1.全局变量

  1. DOM元素上的触发器,本质上是“全局”的(从JSAngular 来看)
    1.通过连续的参数传递
    1.使用AMD
    1 -全局变量:
// File1
window.page_object_test = {};
_.extend(window.page_object_test, Parse.Events);
window.page_object_test.trigger("boom");

// File2
window.page_object_test.on('boom', callback); // Always prefer `on` over `bind`, depreciated in most frameworks

全局变量被认为是危险的,但却是在全局范围内进行交流的唯一方式,需要谨慎地操纵它们。
例如:具有1个存储整个应用程序状态的全局对象:

var window.AppState = window.AppState || {};
window.AppState.page_object_test = {}; // etc.

2 - DOM元素:

// File1
$('document').trigger('boom'); // or whichever jQuery selector

// File2
$('document').on('boom', callback);

如果你的事件实际上与一个DOM元素相关,这就更有意义了。
3 -作为参数传递

// File2
var generate_listener = function(page_object_test, callback) {
  page_object_test = {};
  _.extend(page_object_test, Parse.Events);

  page_object_test.on('boom', callback);
  return page_object_test;
}

// File1
var page_object_test = {}; 
page_object_test = generate_listener(page_object_test, function(){
  // Do whatever you want here
});
page_object_test.trigger("boom");

这就将问题转移到了generate_listener的通信上,因此没有赢得太多。
1.使用AMD
最后,看看AMD,它的设计是为了模块化你的应用程序,正如你所期望的那样(基本上,它为你处理全局变量的事情,确保你不会在错误的情况下使用它)。

ih99xse1

ih99xse12#

你有没有考虑过 puppet ?
https://github.com/marionettejs/backbone.wreqr
默认情况下,它在 puppet 中使用,但也可以在外部单独使用。
否则,您可以使用Backbone.Events,如Backbone文档中所述

var object = {};
_.extend(object, Backbone.Events);
object.on('expand', function(){ alert('expanded'); });
object.trigger('expand');

假设 object 在全局范围内可用,则可以订阅并触发其上的事件。

相关问题