2012-02-16 8 views
6

belgesine bir anahtarlı bağ kurarım ve işlevselliği klavye denetimini içermek üzere genişletmek istedim. şovum şablonuna OnBackbone.js'de backbone.js'nin bir Railscast öğreticisi ile birlikte izlediğim

class Raffler.Views.EntryShow extends Backbone.View 
    template: JST['entries/show'] 

    events: 
    'click .back': 'showListing' 
    'keyup': 'goBack' 

    showListing: -> 
    Backbone.history.navigate("/", trigger: true) 

    goBack: (e) -> 
    console.log e.type, e.keyCode 

    render: -> 
    $(@el).html(@template(entry: @model)) 
    this 

Ben şu var: Ben sekme tuşunu kullanarak geri bağlantı seçerseniz

<a href="#" class="back">Back</a> 
<%= @entry.get('name') %></td> 

, o zaman olsun rastgele tuşlara basarak başlamak benim gösteri görünümüne aşağıdaki eklendi javascript konsolumdaki çıktı. Ancak sayfayı yüklerim ve bağlantıyı seçmezsem ve sadece tuşlara basmaya başlarsam konsolumda çıktı olmaz.

Olayı belgeye nasıl bağlarım? Ekranı yüklerken basılan herhangi bir tuşun dinlenmesini sağlar?

+1

olası bir kopyasının [backbone.js - bir girdiden gelen değeri içeren bir koleksiyonun filtrelenmesi] (http://stackoverflow.com/questions/9244773/backbone-js-filtering-a-collection-with-the-value- -den-a-giriş) –

+0

aynı işlevsellik ama yinelenen bir yinelenen olarak göründüğünden kuşku duyuyorum, bu kişi özellikle bir görüşün kapsamı etrafında çalışabilir, bir anahtar yukarı olayı belgeye nasıl bağlayacağını sorar ve tek giriş. Belgenin, görüş alanının kapsamı dışında olması. kendi örneğinde sadece 'anahtarlama' ye bağlanır, bu da onu kendi görüşünün konteynır elemanına bağladığı anlamına gelir, ki bu büyük olasılıkla bütün sayfa değildir. – Sander

cevap

6

Görünümler için omurganın kapsamı etrafında çalışmanız gerekir. zaman böyle bir şey yapıyorlar:

events: 
    'click .back': 'showListing' 
    'keyup': 'goBack' 

size bakış kapsayıcınız elemanı üzerinde yükseltilmiş keyup olayı için goBack fonksiyonunu bağlayıcı niteliktedir.

() kendi manzara yok ( ! *) Eğer görüntülemek dışında bir şeye bağlamak istiyorsanız, bunun yerine yapmanın

(varsayılan olarak div hangi görünümü oluşturulur)

Raffler.Views.EntryShow = Backbone.View.extend({ 
    template: JST['entries/show'], 

    events: { 
    'click .back': 'showListing' 
    }, 

    initialize: function() { 
    $('body').keyup(this.goBack); 
    }, 

    showListing: function() { 
    Backbone.history.navigate("/", trigger: true); 
    }, 

    goBack: function (e) { 
    console.log e.type, e.keyCode; 
    }, 

    render: function() { 
    $(this.el).html(this.template(entry: @model)); 
    return this; 
    } 

}); 

(*), yukarıda belirtilen uygun sözler sizi tam bağlamak istediğiniz öğe size tam sayfa (uygulama görünümü falan gibi bir görünüm varsa, kendi manzara yok sadece bunu Buradaki anahtarlığı bağlayabilir ve örneğin bir olayı App.trigger('keypressed', e); açabilirsiniz.

, EntryShow görünümünüzde bu uygulamanın keypressed etkinliğine bağlayabilirsiniz.

App.bind('keypressed', goBack); 

Eğer gecikmiş bir olay olarak bir şeyler yapmak gerektiğini akılda tutmak veya gruplama, bazı durumlarda bir araya basılmasını vücutta olur her tuşa basma ateş gibi büyük bir performans isabet olabilir. özellikle eski tarayıcılarda.

+0

Bu, bir görünümün ilk yüklemesinde benim için çalışır. Ancak kullanıcı ikinci kez görüntülemeye gittiğinde, bağlanma yeniden uygulanır ve yöntem her bir 'anahtar' olayına iki kez ateşlenir. – wuliwong

+0

bunu 2 şekilde çözebilir, omurga kuklacı (veya kendiniz yazdığınız gibi) gibi bir görünüm yöneticisi kullanabilir ve görünüm kapandığında tuşa basılan etkinliği kaldırabilirsiniz. Ya da onu bağlı bırakabilirsiniz, ancak bazı işlenmiş durumlarla çalışabilirsiniz. Tuşa basılan etkinliğe bağlandığınızda, bunu yalnızca bir kez yaparsınız, tuşa basılan işlemin konteynırda olup olmadığını kontrol edin. değilse, ona bağlanın, sadece yapmayın. (bağladıktan sonra, ikinci kez ziyaret ettiğinizde sınıfı yeniden ayarlamanız gerekir.) – Sander

4

Etkinlikleriniz, görünüm öğeniz @el kapsamına alınacaktır. document etkinlikleri yakalamak için bunu kendin rulo zorunda:

initialize: -> 
    $(document).on "keyup", @goBack 

remove: -> 
    $(document).off "keyup", @goBack 

hile yapalım mı.

+1

Bu cevap, ciltlemenin kaldırılmasına yöneliktir, ancak 'remove()' otomatik olarak aranmaz, doğru mu? Bir kullanıcının bir görünümden uzaklaştığı her zaman denen bir şeye ihtiyacınız vardır. Bunun yerine, geçerli görünümümde kullanmadan önce herhangi bir önceki bağlamaların kaldırıldığından emin oluyorum. Bu hacky, ama işe yarıyor. – wuliwong

+0

@wuliwong yep Sanırım 'remove()' otomatik olarak çağrılır. Kullanıcı görünümden ayrıldığında otomatik olarak çağrılan 'initialize'in tam tersi nedir? Dokümanta bulamadı. Herhangi bir çözüm? –