2012-02-16 27 views
6

Tôi đã theo dõi cùng với hướng dẫn Railscast về backbone.js và tôi muốn mở rộng chức năng bao gồm điều khiển bàn phím. Tôi thêm vào phần sau đây để xem chương trình của tôi:Trong backbone.js làm cách nào để liên kết khóa với tài liệu

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 

Trong chương trình mẫu của tôi, tôi đã điều sau đây:

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

Nếu tôi chọn liên kết lại bằng cách sử dụng phím tab, sau đó bắt đầu đánh phím ngẫu nhiên tôi nhận được đầu ra trong giao diện điều khiển javascript của tôi. Tuy nhiên nếu tôi tải trang và không chọn liên kết và chỉ bắt đầu nhấn phím, tôi sẽ không nhận được kết quả đầu ra trong bảng điều khiển của mình.

Làm cách nào để liên kết sự kiện với tài liệu để nó sẽ nghe mọi phím được nhấn khi tải màn hình?

+1

bản sao có thể có của [backbone.js - lọc một bộ sưu tập có giá trị từ đầu vào] (http://stackoverflow.com/questions/9244773/backbone-js-filtering-a-collection-with-the-value- từ-a-input) –

+0

nó là chức năng tương tự nhưng tôi nghi ngờ nó có thể được xem như là một bản sao, người này đặc biệt hỏi làm thế nào anh ta có thể làm việc xung quanh phạm vi của một khung nhìn, ràng buộc một sự kiện quan trọng đối với tài liệu chứ không phải đầu vào đơn. tài liệu có nhiều khả năng nằm ngoài phạm vi của chế độ xem. trong ví dụ của anh ta, anh ta chỉ liên kết với 'keyup' có nghĩa là anh ta ràng buộc nó với phần tử container của chế độ xem của anh ấy, rất có thể không phải là toàn bộ trang. – Sander

Trả lời

6

Bạn sẽ cần phải làm việc xung quanh phạm vi của xương sống cho các chế độ xem. khi bạn đang làm một cái gì đó như thế này:

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

bạn đang ràng buộc chức năng goBack mình vào sự kiện KeyUp lớn lên trên yếu tố container lại nhìn của bạn. (Theo mặc định div trong đó quan điểm được hiển thị)

thay vì làm điều đó, nếu bạn muốn để ràng buộc vào một cái gì đó bên ngoài tầm nhìn của bạn (mà không có nó là điểm riêng! (*))

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; 
    } 

}); 

(*) nhận xét như đánh dấu ở trên, bạn tốt nhất làm được điều này chỉ khi mục mà bạn muốn liên kết với không có nó là điểm riêng, nếu bạn có một cái nhìn cho trang đầy đủ của bạn (độ xem ứng dụng hoặc một cái gì đó như rằng) bạn có thể ràng buộc khóa trong đó, và chỉ cần nâng cao một sự kiện App.trigger('keypressed', e); chẳng hạn.

khi đó bạn có thể ở chế độ xem Xuất cảnh, liên kết với sự kiện keypressed của ứng dụng đó.

App.bind('keypressed', goBack); 

hãy nhớ rằng bạn nên làm điều gì đó như một sự kiện bị trì hoãn hoặc tổ hợp phím với nhau trong một số trường hợp, có thể là một hit hiệu suất lớn. đặc biệt là trên các trình duyệt cũ hơn.

+0

Điều này làm việc cho tôi trên tải ban đầu của chế độ xem. Nhưng khi người dùng điều hướng đến khung nhìn lần thứ hai, thì ràng buộc được áp dụng lại và phương thức này được kích hoạt hai lần trên mỗi sự kiện 'keyup'. – wuliwong

+0

bạn có thể giải quyết điều đó theo 2 cách, bạn có thể sử dụng trình quản lý chế độ xem, chẳng hạn như marionette đường trục (hoặc bạn viết chính mình) và hủy liên kết sự kiện nhấn phím khi chế độ xem đóng. Hoặc bạn có thể để nó bị ràng buộc, nhưng làm việc với một số trạng thái được xử lý. khi bạn liên kết với sự kiện nhấn phím bạn chỉ làm điều đó một lần, hãy kiểm tra xem lớp keypressedprocessed có nằm trong vùng chứa hay không. nếu không, liên kết với nó, nếu không thì không. (sau khi ràng buộc bạn phải thiết lập lớp để lần thứ hai bạn truy cập bạn không ràng buộc lại.) – Sander

4

Sự kiện của bạn sẽ được đưa vào phần tử chế độ xem @el. Để nắm bắt các sự kiện trên document, bạn phải tự cuộn mình:

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

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

Nên thực hiện thủ thuật.

+1

Câu trả lời này giải quyết việc loại bỏ ràng buộc nhưng 'remove()' không được gọi tự động, đúng không? Bạn cần một thứ được gọi mỗi khi người dùng điều hướng khỏi chế độ xem. Thay vào đó, tôi chỉ đảm bảo rằng mọi ràng buộc trước đó sẽ bị xóa trước khi áp dụng chúng trong chế độ xem hiện tại của tôi. It's kinda hacky, nhưng nó hoạt động. – wuliwong

+0

@wuliwong yep Tôi không nghĩ rằng 'remove()' được gọi tự động. Điều ngược lại với 'initialize' được gọi tự động khi người dùng điều hướng khỏi chế độ xem là gì? Không thể tìm thấy một tài liệu trong tài liệu. Bất kỳ giải pháp? –

Các vấn đề liên quan