gpt4 book ai didi

javascript - 主干 View 事件在重新渲染后不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 04:37:27 26 4
gpt4 key购买 nike

我正在拔头发,在重新渲染 View 后,我似乎无法让鼠标事件在我的主干 View 上工作,除非我做了最荒谬的事情:

$("a").die().unbind().live("mousedown",this.switchtabs);

我实际上有这个但决定更新到最新的主干并尝试使用新的 delegateEvents() 函数。

这是我的项目 ID 的结构方式:

Appview / AppRouter
|
----->PageCollection
|
------->PageView/PageModel
------->PageView/PageModel these page view/models are not rendered
------->PageView/PageModel
|
------->PageView/PageModel
|
----->render() *when a pageview is rendered*
|
-----> Creates new
Tabcollection
|
--->TabModel/TabView <-- this is where the issue is

发生的事情是 tabcollection 有一个主 tabview 来管理所有选项卡,然后为每个选项卡创建一个新的模型/ View ,并放置一个监听器以在加载选项卡时重新呈现 tabview。如果重新呈现 tabview,则鼠标事件将不再起作用,除非我将人为设计的 jQuery 语句放在那里。

这是 tabview 和渲染(我把它精简了很多)

var TabPanelView = Backbone.View.extend({
className: "tabpanel",
html: 'no content',
model: null,
rendered: false,
events:{
'click a.tab-nav': 'switchtabs'
},
initialize: function(args)
{
this.nav = $("<ol/>");
this.views = args.items;
this.className = args.classname?args.classname:"tabpanel";
this.id = args.id;
this.container = $("<section>").attr("class",this.className).attr("id",this.id);
_.bindAll(this);
return this.el
},
/*
This render happens multiple times, the first time it just puts an empty html structure in place
waiting for each of the sub models/views to load in (one per tab)
*/
render: function(args){
if(!args)
{
//first render
var nav = $("<aside/>").addClass("tab-navigation").append("<ol/>").attr("role","navigation");
var tabcontent = $("<section/>").addClass("tab-panels");
for(i = 0;i<this.views.length;i++)
{
$("ol",nav).append("<li><a rel='"+this.views[i].id+"' href='javascript:;' class='tab-nav'></a></li>");
tabcontent.append(this.views[i].el);
}
this.$el.empty().append(nav).append(tabcontent);
}
else if(args && args.update == true){
// partial render -- i.e. update happened inside of child objects
var targetid = args.what.cid;
for(i = 0;i<this.views.length;i++)
{
var curcontent = this.$el.find("div#"+this.views[i].id);
var curlink = this.$el.find("a[rel='"+this.views[i].id+"']")
if(this.views[i].cid == targetid)
{
curcontent.html($(this.views[i].el).html());
curlink.text(this.views[i].model.rawdata.header);
}
if(i>0)
{
// set the first panel
curcontent.addClass("tab-content-hide");
}
if(i==0)
{
curcontent.addClass("tab-content-show");
curlink.addClass("tab-nav-selected");
}
// this ridiculous piece of jQuery is the *ONLY* this i've found that works
//$("a[rel='"+this.views[i].id+"']").die().unbind().live("mousedown",this.switchtabs);
}
}
this.delegateEvents();
return this;
},
switchtabs: function(args){

var tabTarget = args.target?args.target:false
if(tabTarget)
{
this.$el.find("aside.tab-navigation a").each(function(a,b)
{
$(this).removeClass("tab-nav-selected")
})
$(tabTarget).addClass("tab-nav-selected");
this.$el.find("div.tab-content-show").removeClass("tab-content-show").addClass("tab-content-hide");
this.$el.find("div#"+tabTarget.rel).removeClass("tab-content-hide").addClass("tab-content-show");
}
}
});

谁能想到为什么主干鼠标事件根本不触发,是因为它们不在 DOM 上吗?我认为这是 backbone 特别有用的地方?...

最佳答案

这行代码可能是您的问题:

this.delegateEvents();

删除它,它应该可以工作。

您唯一需要自己调用 delegateEvents 的情况是,当您的事件与 View 的 events 散列分开声明时。当您创建 View 实例时,Backbone 的 View 会为您调用此方法。

关于javascript - 主干 View 事件在重新渲染后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9700578/

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