2011-10-12 12 views
18

Tüm görünümler için bir temel sınıfım var ve uygulamanın her bölümünde profiller gibi bir temel sınıfım da var. Bu şekilde paylaşılan şablonlar ve özellikler, uygulamamın genelinde birçok düzeyde kullanılabilir.Olayı otomatik olarak temel görünümden genişletme

Olay özelliğini bir Backbone görünümünde bir nesne değişmezi yerine bir işlev olarak yaparsanız, sizin için örneklendirileceğini biliyorum, ancak bu avantajı nasıl kullanacağımı bilmiyorum. Sorum şu; temel görünümde oluşturulan etkinlikleri otomatik olarak genişletmenin en iyi yolu nedir?

Temel olay sınıfını getirdiğim, temel olay sınıfını getirdiğim ve o andaki etkinliğimi ona genişletdiğim bir ihtimal biliyorum, ancak biraz rahatsız edici görünüyor ve bu kodu her görünümde çoğaltmak zorundayım. Daha iyi bir yol biliyorsanız, lütfen paylaşın.

Teşekkürler.

var ParentView = Backbone.View.extend({ 

     events: { 
      'click .link': 'onLinkClick' 
     } 
}); 

var ChildView = ParentView.extend({ 

     events: function(){ 
      return _.extend({ 
       'click .something': 'onSomethingClick', 
      }, this.constructor.__super__.events); 
     } 
}); 

Not: Bu sadece eser Backbone 0.5.3 itibariyle Çocuğumun görünümünde ana görünümün olayları uzatmak nasıl İşte

+0

Bu mesaj/bağlantılara (mümkünse çiftleri) bakmak isteyebilirsiniz:
Ben de kullanıyorum başka yolda özünü oluşturduk http://stackoverflow.com/questions/6257405/backbone -js-görünümü-kalıtım-bu-çözünürlük-ebeveyn-içinde-başka Bir: http://stackoverflow.com/questions/6968487/sub-class-a-backbone-view-sub-class-retain-events Dış site: http: //kalimotxocoding.blogspot.com/2011/03/playing-with-backbonejs-views.html – PhD

+0

Merhaba Nupal, çok geçerli bir yanıt ve daha iyi bir kontrol yaptığınız için teşekkürler. Gönderdiğiniz iki stackoverflow bağlantısı, aşağıda verilenlerden farklı olan iyi bir yanıt aldı. İkisini de ekleyeceğim ve bu özel sorunun kesin kaynağını oluşturacağım (diğer sorular daha geniş). Ayrıca, kalimotxocoding.blogspot.com blog girişi sadece düz korkunç, backbone.exe çekirdeği gerektirir ve aslında bir şey çözmez. Girişini takdir ediyorum. –

cevap

35
var ParentView = Backbone.View.extend({ 
    'events': { 
     'click .parent-something': "onParentSomethingClick" 
    } 
}); 

var ChildView = ParentView.extend({ 
    'events': _.extend({ 
     'click .something': 'onSomethingClick', 
    }, ParentView.prototype.events) 
}); 

Hiçbir şey yapmıyor, ancak şimdiye kadar gördüğüm en basit yol. https://gist.github.com/1271041

+1

Github bağlantısıyla sağladığınız "ana" işlevi müthiş. Ben kesinlikle benim currrent _super uygulamasını benimkiyle değiştiriyorum. Teşekkürler!! – threejeez

+2

Nesnelerinizi başka yoldan _.extend() içine aktarmak istemiyor musunuz? Daha sonra Clone, süper sınıf etkinliklerini yeni olayların üzerine yazacak mı? Böylelikle çocuk işlevselliği ile süper işlevselliğin üzerine yazabilirsiniz, mirasa daha tanıdık bir yaklaşım. – WildService

6

bu. Bu sürümden önce, etkinlikleri bir işlev olarak tanımlayamadınız.

+0

Teşekkürler JohnnyO. Standart olmayan ama her yerde '__proto__' duydum ama JavaScript’te __super__'’yi hiç duymadım. Bu Backbone çekirdeği tarafından bir ek mi yoksa bu modern tarayıcılarda yeni bir şey mi? –

+1

__super__ Backbone çekirdeği tarafından eklenir ve kalıtılan sınıf 'prototipini eşler. –

+0

Rockin '. Teşekkürler JohnnyO. –

2

Bence JohnnyO'nun cevabı en iyisidir. Ancak bunu yapmanın iki farklı yolunu buldum ve onları buraya yapıştırırım.

Her yeni görünümde ek elle yazılmış kod gerektirmeyen “otomatik” bir çözüm bulunmadığı için üzücü bir durumdur, ancak ne olduğu budur. Paul tarafından

ChildView = ParentView.extend({ 
    name: 'ChildView', 
    events: { 
    }, 
    constructor: function(){ 
     this.events = _.extend({}, ParentView.prototype.events, this.events); 
     console.debug(this.events); 
     ParentView.prototype.constructor.apply(this, arguments); 
    }, 
    someFunc: function(){ 
     console.debug('someFunc; this.name=%s', this.name); 
    } 
}); 

- backbone.js view inheritence. `this` resolution in parent

Ben size Backbone.view.extend bir yapıcı yöntemini sağlayabilir bilmiyordum. Bilmek güzel. rulfzid By

var GenericView = Backbone.View.extend({ 

    genericEvents: { 'click .close': 'close' }, 

    close: function() { console.log('closing view...'); } 

}); 

var ImplView = GenericView.extend({ 

    events: { 'click .submit': 'submit' }, 

    initialize: function(options) { 
    // done like this so that genericEvents don't overwrite any events 
    // we've defined here (in case they share the same key) 
    this.events = _.extend(this.genericEvents, this.events); 
    this.delegateEvents() 
    } 
}); 

- Sub Class a Backbone.View Sub Class & retain events

Zaten öngörülen (ve reddedildi) bu yaklaşımı ama bu bir "genericEvents herhangi Olayların üzerine değil" böylece başka Baz olay şey çağıran ilave bir bükülme vardır vardı yazarın dediği gibi. Her iki etkinlik nesnesinin içinden geçtiğiniz her iki olaydan bahsetmedikçe, ne konuştuğundan emin değilim, ebeveyn olaylarına referans vermek için proto veya prototip kullanıyorum. Ama yine de, bilmek güzel.

+1

Çocuk Görünümü'nün tanımının içinde _.extend ({}, ParentView.prototype.events, {'click': 'close'}) 'satır içi satırları kullanabilirsiniz. O zaman kurucuya gerek yok. –