gpt4 book ai didi

javascript - 主干事件触发两次

转载 作者:可可西里 更新时间:2023-11-01 02:05:56 25 4
gpt4 key购买 nike

为什么我必须创建一个整体 close prototype只是为了让我的事件在我看来不受约束? Backbone 不应该直接构建它吗?有没有办法检测何时删除 View ?

在我离开并返回 View 后,我的主干事件会触发两次。

        events : {
"click #userDropdownButton > a" : "toggleUserDropdownMenu",
"click" : "hideUserDropdownMenuIfClickedOutside"
},

el : "body",

initialize : function() {
this.render();
},

// Shows/hides the user dropdown menu
toggleUserDropdownMenu : function() {
if(!this.$el.find('#userDropdownButton > ul').is(':visible')) {
this.showUserDropdownMenu();
} else {
this.hideUserDropdownMenu();
}
return false;
},
showUserDropdownMenu : function() {
this.$el.find('#userDropdownButton').addClass('hover');
this.$el.find('#userDropdownButton > ul').show();
this.$el.find('#userDropdownButton > a .arrow-down').removeClass('arrow-down').addClass('arrow-up');
},
hideUserDropdownMenuIfClickedOutside : function() {
if(this.$el.find('#userDropdownButton > ul').is(':visible')) {
this.hideUserDropdownMenu();
}
},
hideUserDropdownMenu : function() {
this.$el.find('#userDropdownButton').removeClass('hover');
this.$el.find('#userDropdownButton > ul').hide();
this.$el.find('#userDropdownButton > a .arrow-up').removeClass('arrow-up').addClass('arrow-down');
},

第一次呈现 View 时,下拉菜单会正确打开和关闭,但在第二次呈现 View 时,下拉菜单会将每次点击解释两次,因此一旦打开,第二次点击就会将其关闭。

最佳答案

更新 2013/05/01:Backbone 0.9.9+ 添加了一些内置功能以方便处理 zomg 问题(参见 View.removeStopListening);但您仍然需要通过调用其中一个来杀死您的僵尸。


为什么我必须创建一个完整的封闭原型(prototype)才能让我的事件在我的 View 中解除绑定(bind)?

Derick's article非常擅长涵盖整个问题。但我可以添加我的两个位,解决你的“为什么”它不是内置的问题。

由于 Backbone 事件委托(delegate)的工作方式,如果 View 具有事件绑定(bind),则它们在超出范围时不会被垃圾回收。这是因为事件绑定(bind)到的对象——在绑定(bind)到 Backbone 对象事件的情况下是 Backbone 对象,或者在“事件”回调的情况下是 DOM 事件系统——维护对 View 函数的引用。

信不信由你,一些 Backbone 用户依赖于这种行为,并希望 View 继续像他们被告知的那样自动响应事件,即使它们已经完全超出范围。 (我看过几个这样做的教程。)这假设您永远不需要删除 View ,或者 View 可以响应事件并删除自身,因为您已经丢失了对它的任何引用,但是 IMO,这个 '只要您理解其中的含义,“创建并忘记”功能就很好。

mu is too short 很好地说明了 UI 事件。从 DOM 中删除 el 也应该删除委托(delegate)事件。对于绑定(bind)到模型或集合事件或绑定(bind)到其他 Backbone 对象的事件(任何对象都可以扩展 Backbone Events 原型(prototype)),情况就不同了。在这些情况下,您需要遵循链接到的文章中 Derick Bailey 的建议并手动关闭 View 。我不确定与其他 JS MVC 框架相比,这是否是 Backbone 的弱点,我还没有深入尝试过其他框架。

“有没有办法检测 View 何时被删除?”

据我所知,不是直接的。但一般来说,无论哪个代码正在删除 View ,都应该在需要时清理事件绑定(bind)。通常,在良好的 MVC 架构中, View 可以在相应的模型或集合上设置事件观察器,然后根据发生的事件(例如,来自相应模型的“删除”事件)删除和清理自己。如果您想让您的 View 删除普遍“可检测”,一种方法是覆盖您自己的 View 原型(prototype)中的删除功能并触发其他人可以观察到的自定义事件。

关于javascript - 主干事件触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com