2012-01-09 31 views
5

Tôi có Mô hình có 1 đầu vào. Ngoài ra, tôi có một Bộ sưu tập. Bây giờ, khi tôi thêm một mô hình vào bộ sưu tập, tôi muốn đặt trọng tâm cho đầu vào của nó. Để chính xác, tôi cần đặt trọng tâm vào đầu vào của chế độ xem mô hình mới được tạo.backbone.js: đặt trọng tâm vào đầu vào sau khi hiển thị

Tuy nhiên, tôi dường như không làm cho nó hoạt động. Dưới đây là chức năng của tôi có thêm quan điểm của mô hình để xem bộ sưu tập:

addOne: function(InvoiceItem) { 
    var view = new InvoiceItemView({model: InvoiceItem}); 
    this.$('tr[data-id="'+InvoiceItem.get('after')+'"]').after(view.render().el); 
    this.$('tr[data-id="'+InvoiceItem.cid+'"]').css('background', 'green'); 
    this.$('tr[data-id="'+InvoiceItem.cid+'"] input').focus(); 
}, 

Vấn đề là, cuộc gọi thứ ba: this.$('tr[data-id="'+InvoiceItem.cid+'"] input').focus(); không làm gì cả. Và đó là lạ, bởi vì có vẻ như tôi chỉ có thể thực hiện thao tác DOM trên phần tử gốc tr và không có gì khác ngoài điều đó. Có vẻ như với tôi rằng jQuery không biết rằng các yếu tố tồn tại, đó là lạ, bởi vì khi tôi làm alert(this.$('tr[data-id="'+InvoiceItem.cid+'"] input').length) Tôi nhận được 1, cho biết rằng các yếu tố tồn tại.

Tôi đang làm gì sai ở đây?

Trả lời

19

Sử dụng _.defer cố định vấn đề của tôi:

var $this = this; 
_.defer(function(){ 
    $this.$('tr[data-id="'+InvoiceItem.cid+'"] input').focus(); 
}); 
+0

Đây là [link to the documentation] (http://underscorejs.org/#defer). –

2

Thay vì this.$('tr[data-id="'+InvoiceItem.cid+'"] input').focus();

thử này

$(view.render().el).find('input').focus(); 
+0

Không có vẻ làm việc và tôi nghĩ rằng tôi biết lý do tại sao: quan điểm bộ sưu tập được tái rendered vì những thay đổi bộ sưu tập lần tôi thêm mục vào khung nhìn. Và tái rendering mất tập trung từ bất kỳ đầu vào ... Có cách nào để khôi phục tập trung sau khi tái render? – ragulka

+0

Đoán đầu tiên của tôi là vì chế độ xem bộ sưu tập được hiển thị lại, nhưng dường như không phải như vậy (tôi đã thử với cảnh báo đơn giản() để xem kết xuất có được kích hoạt hay không). Thật lạ vì ngay cả khi tôi chỉ làm $ ('input'). Hide() - nó không làm gì cả. EDIT: thực sự có vẻ như đôi khi, sau khi một số lượng certai thời gian đã trôi qua, có vẻ như để ẩn đầu vào của hàng đầu tiên – ragulka

+0

@ragulka Bạn có thể chia sẻ bộ sưu tập, mô hình và mã xem của bạn không. Có lẽ một số sự kiện bắn gây ra nó – Paul

2

Tôi đã có một vấn đề rất giống như của bạn và kết thúc ở đây trong khi tìm kiếm một giải pháp. Bài đăng của bạn đã được vài tháng trước, do đó bạn có thể đã chuyển qua quá trình này, nhưng hy vọng điều này sẽ giúp người khác. Tôi đã có thể giải quyết vấn đề bằng cách sử dụng jQuery's ready function handler. Tôi luôn nghĩ rằng nó chỉ có thể được sử dụng trên document nhưng bạn cũng có thể sử dụng nó trên các subnodes. Hãy thử điều này:

addOne: function(InvoiceItem) { 
    var view = new InvoiceItemView({model: InvoiceItem}); 
    $('tr[data-id="'+InvoiceItem.get('after')+'"]').ready(function(){ 
     $('tr[data-id="'+InvoiceItem.cid+'"]').css('background', 'green'); 
     $('tr[data-id="'+InvoiceItem.cid+'"] input').focus(); 
    }); 
    $('tr[data-id="'+InvoiceItem.get('after')+'"]').after(view.render().el); 
}, 
+0

Mặc dù nó có thể được sử dụng trên các nút con, nó sẽ không chờ đợi cho các subnodes để trở thành sẵn sàng, nhưng chỉ * chờ cho DOM trở nên ** an toàn để thao tác *. Điều này có chính xác tác dụng tương tự của $ '(function() {console.log ('ready')})' –