获取 Backbone 中另一个视图的 ID
Get id of another view in Backbone
我有两个视图,其中一个有一个搜索框,其中包含一个按钮 "Search" 和 id="search"
。在第二个视图中,我希望在单击按钮 "Search" 时进行搜索。但是对于这种情况,我需要获取 id。怎么做到的?
这里是我的第二个视图的代码,但是因为 #search
在第一个视图中所以不起作用:
ev.views.Home = Backbone.View.extend({
events: {
'click #search' : 'searchKey',
});
所有事件哈希都限于视图 el
。因此事件不会被触发。全局访问元素并在视图的初始化中使用 jquery 绑定事件。
ev.views.Home = Backbone.View.extend({
initialize:function(){
$('#search').click(this.searchKey);
}
});
编辑:这个答案正好解决了这个问题。考虑 Peter Wagener 的答案。
全局附加一个 click
侦听器会起作用,但随着应用程序的增长,它会变得难以使用。您最好将每个 View
视为页面上的一个矩形, 只有 知道其内部发生的事情。当两个视图需要交互时,您需要某种方式来协调它们。
一个简单的建议是使用模型作为两个视图之间的事件总线:
var ViewWithSearch = Backbone.View.extend({
events: {
'click .search' : 'searchKey'
},
initialize: function(options) {
this.eventModel = options.eventModel;
},
searchKey: function(event) {
this.eventModel.trigger('search', event)
}
});
var ReactingView = Backbone.View.extend({
initialize: function(options) {
this.listenTo(options.eventModel, 'search', this.onSearch);
},
onSearch: function(eventModel, event) {
console.log("Search was clicked!");
}
});
var eventModel = new Backbone.Model();
new ViewWithSearch({
eventModel: eventModel
}).render();
new ReactingView({
eventModel: eventModel
}).render();
这肯定比全局事件复杂,但对于 MV*
设计也是如此。您会得到一组很好地解耦的视图,它们对自己一无所知 "outside",使它们易于维护(和测试!)。
有很多库提供这种功能;例如,Backbone.Radio 正是为这种事情而构建的。
我有两个视图,其中一个有一个搜索框,其中包含一个按钮 "Search" 和 id="search"
。在第二个视图中,我希望在单击按钮 "Search" 时进行搜索。但是对于这种情况,我需要获取 id。怎么做到的?
这里是我的第二个视图的代码,但是因为 #search
在第一个视图中所以不起作用:
ev.views.Home = Backbone.View.extend({
events: {
'click #search' : 'searchKey',
});
所有事件哈希都限于视图 el
。因此事件不会被触发。全局访问元素并在视图的初始化中使用 jquery 绑定事件。
ev.views.Home = Backbone.View.extend({
initialize:function(){
$('#search').click(this.searchKey);
}
});
编辑:这个答案正好解决了这个问题。考虑 Peter Wagener 的答案。
全局附加一个 click
侦听器会起作用,但随着应用程序的增长,它会变得难以使用。您最好将每个 View
视为页面上的一个矩形, 只有 知道其内部发生的事情。当两个视图需要交互时,您需要某种方式来协调它们。
一个简单的建议是使用模型作为两个视图之间的事件总线:
var ViewWithSearch = Backbone.View.extend({
events: {
'click .search' : 'searchKey'
},
initialize: function(options) {
this.eventModel = options.eventModel;
},
searchKey: function(event) {
this.eventModel.trigger('search', event)
}
});
var ReactingView = Backbone.View.extend({
initialize: function(options) {
this.listenTo(options.eventModel, 'search', this.onSearch);
},
onSearch: function(eventModel, event) {
console.log("Search was clicked!");
}
});
var eventModel = new Backbone.Model();
new ViewWithSearch({
eventModel: eventModel
}).render();
new ReactingView({
eventModel: eventModel
}).render();
这肯定比全局事件复杂,但对于 MV*
设计也是如此。您会得到一组很好地解耦的视图,它们对自己一无所知 "outside",使它们易于维护(和测试!)。
有很多库提供这种功能;例如,Backbone.Radio 正是为这种事情而构建的。