的目的Backbone.View
是将对某个 DOM 子树的访问封装到一个定义良好的单个类中。传递对 DOM 元素的引用是一种糟糕的 Backbone 做法,这些应该被视为视图的内部实现细节。
相反,您应该让您的观点直接或通过调解员间接交流。
直接沟通可能类似于:
var ViewA = Backbone.View.extend({
getSelectedValue: function() {
return this.$(".combo").val()
}
});
var ViewB = Backbone.View.extend({
initialize: function(options) {
this.viewA = options.viewA;
},
doSomething: function() {
var val = this.viewA.getSelectedValue();
}
});
var a = new ViewA();
var b = new ViewB({viewA:a});
间接地,使用根Backbone
对象作为中介:
var ViewA = Backbone.View.extend({
events: {
"change .combo" : "selectedValueChanged"
},
selectedValueChanged: function() {
//publish
Backbone.trigger('ViewA:changed', this.$('.combo').val());
}
});
var ViewB = Backbone.View.extend({
initialize: function(options) {
//subscribe
this.listenTo(Backbone, 'ViewA:changed', this.doSomething);
},
doSomething: function(val) {
//handle
}
});
var a = new ViewA();
var b = new ViewB();
当然,上面的内容非常通用,但我在这里要说明的一点是,您不必担心 DOM 元素是否被交换,因为没有其他视图应该知道元素的存在。如果您定义视图之间的接口(通过方法调用或中介消息传递),您的应用程序将更易于维护且不那么脆弱。