我认为 Backbone View 类足够抽象。您所要做的就是在创建新的 View 实例时传递不同的选项。
我发现你把计算逻辑放在 View 的 render 方法中。因为 Backbone 是一个基于 MVC 的框架,所以逻辑应该放在 Model 和 View 注册事件处理程序中,该事件处理程序负责在 Model 触发感兴趣的视图事件时渲染布局。
在我看来,您可以添加一个模型来处理计算和重新定义您的视图。
我的简单例子:
1.定义一个响应逻辑计算的模型:
var MathModel = Backbone.Model.extend({
result: 0,
initialize: function(){
console.log("calculate target: "+this.get("selector"));
console.log("calculate method: "+this.get("method"));
var number = this.handlePluginData();
this.doSomethingWithResult(number);
},
handlePluginData: function(){
return $(this.get("selector")).text();
},
doSomethingWithResult: function(number){
if(this.get("method")==="square"){
this.set({result:(number*number)});
}else{
this.set({result:(number*number*number)});
}
}
});
2.重新定义View类:
View 将为模型“结果”数据更改事件注册一个侦听器,并根据您分配的模型呈现初始布局。
var AbstractView = Backbone.View.extend({
initialize: function(){
this.listenTo(this.model,"change",this.onModelChange);
this.number = this.model.get("result");
this.render();
},
render: function(){
this.$el.html(this.number);
},
onModelChange: function(model){
this.number = model.get("result");
this.render();
},
plusOne:function(){
this.model.doSomethingWithResult(this.model.handlePluginData());
}
});
3.当您实例化一个新视图时,将不同的选项传递给模型。
var view1 = new AbstractView({el:"#result1",model:new MathModel({selector:".square",method:"square"})});
var view2 = new AbstractView({el:"#result2",model:new MathModel({selector:".cubic",method:"cubic"})});
4.HTML:
<div id="select-target">
<span class="square">2</span>
<span class="cubic">2</span>
<button id="plus-one">+1</button>
</div>
<div id="result">
<span id="result1"></span>
<span id="result2"></span>
</div>
5.加一键点击事件处理:
您可以观察 View 在模型更改时如何重新呈现其布局。
$("#plus-one").click(function(){
$(".square").text(Number($(".square").text())+1);
$(".cubic").text(Number($(".cubic").text())+1);
view1.plusOne();
view2.plusOne();
});
希望这对你有帮助。