Backbone View sınıfının yeterince soyut olduğunu düşünüyorum. Tek yapmanız gereken, yeni Görünüm örneğini oluştururken farklı seçenekleri geçmek.
Ve hesaplama mantığını Görünüm'ün render yöntemine yerleştirdiğinizi buldum. Backbone, MVC tabanlı bir çerçeve olduğundan, mantık, ilgilenen Model yangın olayı olduğunda düzen oluşturma düzeninden sorumlu Model ve View register olay işleyicisine yerleştirilmelidir.
Kanaatimce, görünümünüzü hesaplayıp yeniden tanımlayan bir Model ekleyebilirsiniz.
Benim basit bir örnek:
1.Define hesaplama mantığı için cevap olan bir model:
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.Redefine Görünüm sınıfı:
Görünüm modeli için bir dinleyici kaydedecektir " sonuçta "veri değişimi olayı" ve atadığınız modele göre başlangıç düzeni oluşturulur. Yeni Görünüm örneğini zaman
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.Pass farklı seçenek modellemek için.
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.Artı-tek düğme tıklama olay işleyicisi: Görünüm nasıl görebiliyoruz
modeli değiştiğinde o düzeni var re-render.
$("#plus-one").click(function(){
$(".square").text(Number($(".square").text())+1);
$(".cubic").text(Number($(".cubic").text())+1);
view1.plusOne();
view2.plusOne();
});
Bunun sizin için yararlı olacağını umuyorum.
Bu, [Kod Gözden Geçirme] (http://codereview.stackexchange.com/) – Mathletics
Hum için daha iyi bir soru olabilir gibi görünüyor, haklı olabilirsiniz, ama bu kodu soyutlamak istediğimi biliyorum, ' Özellikle omurgada nasıl yapılacağını sormak ve "tablo" olmayan bir model kullanıyorsanız, sorun değil. – NicoSantangelo
Omurga olsun veya olmasın, sorunuz "Bu kodu aldım; nasıl değiştiririm" bu kod incelemesi. İkinci sorunuz için, "sorun değil mi ..." genellikle fikir temelli olduğu anlamına gelir. Bir model ekleyebilir misin? Tabi ki yapabilirsin! Sen-meli? Hiç bir fikrim yok. Bu "model" sadece _other_ modellerinde hesaplamaları çalıştırıyorsa, bir yardımcı sınıfla daha iyi durumda olacağınız gibi geliyor (modele benziyor, ama bir “Backbone” modeli değil.) – Mathletics