events: {
"click span.cpm-right": "collect",
},
initialize: function (attrs) {
this.tabs();//但是我想把这个操作绑定到$el中
},
tabs:function() {//当页面载入时,这个执行
$('.cpm-tabs li').each(function(index){
if($(this).hasClass('on')){
$('.tabs').hide();
$('.tabs:eq('+index+')').show();
}
})
$('.cpm-tabs li').on('click',function(){
var index=$(this).index();
$('.tabs').hide();
$(this).addClass('on').siblings('li').removeClass('on');
$('.tabs:eq('+index+')').show();
})
},
但是我想把这个操作tabs()绑定到$el中;(可能是干扰了大家,实际想问的的代码如下:)
events: {
"click span.cpm-right": "collect",
},
broadcast:function(){
//存在问题:浏览器返回再进来,定时器累加,轮播就乱了
//就是想把他绑定在body里,然后$('body').off()
$(".cpm-broadcast li:eq(0)").clone(true).appendTo($(".cpm-broadcast"));
var liHeight = $(".cpm-swiper").outerHeight();
var index = 0;
function next() {
index++;
$(".cpm-broadcast").animate({
top: -index * liHeight
},400,function(){
if(index == $(".cpm-broadcast li").length -1) {
$(".cpm-broadcast").css({top:0});
index = 0;
}
})
console.log('autoTimer')
}
//自动轮播
this.autoTimer = setInterval(next,3000);
},
render: function (e) {
this.$el.html(this.template(this.model.toJSON()));
this.broadcast();//这里怎么绑定
return this;
},
浏览器返回再进来,定时器累加,轮播就乱了,就是想把他绑定在body里,然后$('body').off(),不知道怎么实现比较好
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
问题更新后回答
你的某个视图模块
页面调用模块时候
到这里为止,你的轮播定时器就能正常运作,但这里有2个问题
当离开页面后,其实定时器也在工作,白白性能开销
由于是单例视图,如果你在不恰当的时机提早require了(比如el选择器的目标元素不在Document上),会导致实例化失败,然后一直失败下去
最佳实践
Backbone.Router仅仅是一个路由,并没有页面功能。
对于这种需求,最好封装一个PageManager,每次路由调用,由PageManager来实例化新的视图和销毁旧视图。
原回答
https://jsfiddle.net/qq286735628/qbgzv3h0/2/
激动,好久没看到关于 Backbone 的提问了。View 拥有一个
events属性,就如楼主的 events 一样,会在 View 初始化的时候自动委托el元素绑定各种事件。比如楼主的events实际上可以转换为如下的代码:更详细的,可以查看 Backbone#View
按楼主的问题,可以把
tabs()写入 events 中,大概更新后的源码应该如下