【发布时间】:2012-01-19 13:32:37
【问题描述】:
我是第一次尝试使用 Backbone.js,但遇到了一些麻烦。我不知道我的问题是我不了解骨干应该如何工作,还是只是代码问题。
我正在尝试创建一个动态菜单,使用它的项目创建主菜单栏没有问题,但是当我悬停其中一个菜单项时,我无法触发悬停事件。
观看次数
var MenuView = Backbone.View.extend({
initialize: function(items) {
this.menu = items;
//Main navigation bar
this.el = $("#main-nav");
this.trigger('start');
this.render();
},
render: function() {
var me = this;
_.each(this.menu, function(mi) {
mi.render(me.el);
});
return this;
},
handleHover: function(e) {
console.debug(e);
}
});
var MenuItemView = Backbone.View.extend({
tagName: 'li',
className:'menu-item',
events: { //none of these work
'hover a':'handleHover',
'mouseover a':'handleHover',
'mouseover':'handleHover',
'click': 'handleHover',
'click a': 'handleHover'
},
initialize: function(mi) {
this.menuItem = mi;
this.el = $("<li class=\"menu-item\"></li>")
},
render: function(parent) {
this.el.append('<a href="' + this.menuItem.get("link") + '">' + this.menuItem.get("text") + '</a>');
parent.append(this.el);
return this;
},
handleHover: function(ev) {
console.debug("Hovering! " + ev + this.menuItem.get("cid"));
console.debug(ev);
return false;
}
});
型号
var MenuItem = Backbone.Model.extend({
defaults: {
parent: null,
children: [],
link: "",
text: ""
}
});
启动代码
$(document).ready(function() {
var menu = new MenuView([
new MenuItemView( new MenuItem({link: "/", text: "Home"})),
new MenuItemView( new MenuItem({link: "/", text: "Users"})),
new MenuItemView( new MenuItem({link: "/", text: "Configuration"}))
]);
});
任何帮助将不胜感激!
谢谢!
更新
好的,在 MenuItemView 视图的 initialize 方法之外定义 el 之后,它可以工作,但是相同的元素会在视图的所有实例上重用,所以我不得不将视图更改为以下代码以使其按我想要的方式工作:
var MenuItemView = Backbone.View.extend({
events: { //none of these work
'hover a':'handleHover',
'mouseover a':'handleHover',
'mouseover':'handleHover',
'click': 'handleHover',
'click a': 'handleHover'
},
el: $('<li class="menu-item"></li>'),
initialize: function(mi) {
this.menuItem = mi;
this.el = $(this.el).clone(true);
},
render: function(parent) {
this.el.append('<a href="' + this.menuItem.get("link") + '">' + this.menuItem.get("text") + '</a>');
parent.append(this.el);
return this;
},
handleHover: function(ev) {
console.debug("Hovering! " + ev + this.menuItem.get("cid"));
console.debug(ev);
return false;
}
});
我是否必须在新实例上克隆元素?
【问题讨论】:
-
你为什么要克隆你的
el?考虑一下何时评估$('<li class="menu-item"></li>'),您就会得到答案。 -
如果我在
initialize方法上为el创建元素,那么事件没有被触发,我该如何解决呢?
标签: javascript jquery backbone.js