Backbone.js 在木偶中观看窗口级DOM事件的更好结构?

Backbone.js 在木偶中观看窗口级DOM事件的更好结构?,backbone.js,coffeescript,marionette,Backbone.js,Coffeescript,Marionette,在CompositeView中,我实现了如下的无限滚动 List.Foo extends Marionette.CompositeView initialize: (collection) -> @page = 1 $(window).on('scroll', @loadMore) loadMore: => if _nearBottom @page++ App.vent.trigger('list:foo:near_bott

在CompositeView中,我实现了如下的无限滚动

List.Foo extends Marionette.CompositeView

  initialize: (collection) ->
    @page = 1
    $(window).on('scroll', @loadMore)

  loadMore: =>
    if _nearBottom
      @page++
      App.vent.trigger('list:foo:near_bottom', @page)

  _nearBottom =>
    $(window).scrollTop > $(document).height - $(window.height) - 200

# Then I have the controller to process the event "list:foo:near_bottom", 
# to ask for adding one more page of data in collection.
代码基本上按照预期工作。但是我觉得它不能令人满意,因为我认为这个ComposteView观察了一些超出其范围的DOM事件,也就是窗口级别的DOM事件

我本想使用一个布局来观看此类事件并进行广播,但我的顶层布局似乎仍然不够宽,无法覆盖窗口/文档:)


我的问题是,在木偶中观看此类窗口/文档级DOM事件的更好结构是什么?谢谢

这个问题很久没有得到回答了,我改变了那个项目的实现,所以我没有碰它

阮的评论提供了非常好的观点,并提醒我回顾这个问题

我对阮的观点也有了新的理解

有些事情必须是全球性的,我们无法避免

这些事项包括但不限于:

  • 路线
  • 页面滚动
  • 页面加载
  • 调整窗口大小
  • 全局键笔划
主干网具有处理路由事件的路由。其他事情并不那么重要,也不那么流行,但它们仍然需要像路由一样处理

在我看来,更好的方法是:在全局级别观看全局DOM事件,发送应用程序事件,而不管谁对它感兴趣

如果我重新执行此功能,我将执行类似的操作(伪代码)

然后,
List.Foo
controller将根据自己的喜好观看应用程序事件
scroll:bottom
,并提供下一页

可能还有其他部分对此事件感兴趣,例如,在页脚视图中弹出一个按钮说您在底部,或者另一个通知说如果您想看到更多,您需要注册,等等。由于木偶的美丽,他们还可以收听应用程序通风,而无需管理窗口级DOM

重要更新 如果您直接在控制器内部而不是在模块级别观看应用程序通风口,请确保控制器将停止收听此通风口,否则侦听器将在
App.vents
中增加,这是内存泄漏

# FooController
onClose: ->
  App.vent.off 'scroll:bottom'

这个问题很久没有得到回答了,我改变了那个项目的实现,所以我没有碰它

阮的评论提供了非常好的观点,并提醒我回顾这个问题

我对阮的观点也有了新的理解

有些事情必须是全球性的,我们无法避免

这些事项包括但不限于:

  • 路线
  • 页面滚动
  • 页面加载
  • 调整窗口大小
  • 全局键笔划
主干网具有处理路由事件的路由。其他事情并不那么重要,也不那么流行,但它们仍然需要像路由一样处理

在我看来,更好的方法是:在全局级别观看全局DOM事件,发送应用程序事件,而不管谁对它感兴趣

如果我重新执行此功能,我将执行类似的操作(伪代码)

然后,
List.Foo
controller将根据自己的喜好观看应用程序事件
scroll:bottom
,并提供下一页

可能还有其他部分对此事件感兴趣,例如,在页脚视图中弹出一个按钮说您在底部,或者另一个通知说如果您想看到更多,您需要注册,等等。由于木偶的美丽,他们还可以收听应用程序通风,而无需管理窗口级DOM

重要更新 如果您直接在控制器内部而不是在模块级别观看应用程序通风口,请确保控制器将停止收听此通风口,否则侦听器将在
App.vents
中增加,这是内存泄漏

# FooController
onClose: ->
  App.vent.off 'scroll:bottom'

我一直在努力解决这个问题,我认为这是你必须处理的“非最佳实践”问题之一。根据定义,主干视图的级别始终低于“窗口”,而且根据定义,滚动事件通常需要在“窗口”级别捕获。这意味着事件通常不可能发生在视图的范围内。请记住在关闭视图时清理听众。@TNguyen,非常感谢您的宝贵意见!我也有一些新的理解类似于你的,但有一些不同,所以我张贴了我自己的答案。请检查:)我一直在努力解决这个问题,我认为这是你必须处理的“非最佳实践”问题之一。根据定义,主干视图的级别始终低于“窗口”,而且根据定义,滚动事件通常需要在“窗口”级别捕获。这意味着事件通常不可能发生在视图的范围内。请记住在关闭视图时清理听众。@TNguyen,非常感谢您的宝贵意见!我也有一些新的理解类似于你的,但有一些不同,所以我张贴了我自己的答案。请核对:)