2012-04-18 22 views
6

Tôi đã tạo một dịch vụ trò chuyện theo thời gian thực kiểu đồng hồ theo thời gian thực trong Meteor, nhưng tôi đang gặp sự cố với tính năng bảo tồn yếu tố tích hợp trong Meteor. Về cơ bản, tôi cần div tin nhắn trò chuyện hiện tại để không được cập nhật trong khi đầu vào văn bản trong đó có tiêu điểm. Tài liệu hướng dẫn có các hướng dẫn sau:Lỗi bảo tồn phần tử trong ứng dụng Meteor

Một vấn đề gai góc khác trong các ứng dụng viết tay là yếu tố bảo quản. Giả sử người dùng đang nhập văn bản vào một phần tử, và sau đó khu vực của trang bao gồm phần tử đó được vẽ lại. Người dùng có thể ở trong một chuyến đi gập ghềnh, làm tiêu điểm, vị trí con trỏ , văn bản được nhập một phần và trạng thái ký tự có dấu sẽ bị mất khi được tạo lại.

Đây là một vấn đề khác mà Meteor giải quyết tự động. Chỉ cần thực hiện chắc chắn rằng mỗi thành phần có thể đặt tiêu điểm của bạn có id duy nhất hoặc có tên duy nhất trong cha mẹ gần nhất có id. Meteor sẽ lưu giữ các yếu tố này ngay cả khi mẫu kèm theo của chúng được hiển thị lại, nhưng sẽ vẫn cập nhật con của chúng và sao chép bất kỳ thay đổi thuộc tính nào .

Làm theo các hướng dẫn này, tôi đặt id duy nhất cho trường nhập của mình để đảm bảo nó không được hiển thị lại trong khi tôi đang nhập. Nhưng bây giờ tôi đang đối mặt với hai vấn đề sau:

Thông báo trò chuyện của người khác cập nhật khi họ nhập, nhưng bản cập nhật này tạm dừng trong khi tôi nhập tin nhắn của riêng tôi. Ngay sau khi tôi ngừng nhập (ngay cả khi trường nhập của tôi đã tập trung), thông báo của họ bắt đầu được cập nhật lại.

Khi thư mới được tạo và div được chèn vào, thư của tôi được cập nhật/trả lại ngay cả khi trường nhập của nó đã tập trung. Điều này khiến nó mất tập trung đột ngột.

Bạn có thể thử nghiệm điều này với hai máy tính/người dùng khác nhau trong cùng một phòng trò chuyện tại http://babble.im.

Đây có phải là lỗi trong mã Meteor hay của tôi không? Làm thế nào tôi có thể tìm ra?

Edit:

Ah, tôi nghĩ rằng tôi đã tìm thấy lý do cho vấn đề đầu tiên:

Meteor thường lô lên bất kỳ bản cập nhật cần thiết và thực thi chúng chỉ khi mã của bạn không chạy. Bằng cách đó, bạn có thể chắc chắn rằng DOM sẽ không thay đổi từ bên dưới bạn. Đôi khi bạn muốn hành vi ngược lại . Ví dụ: nếu bạn vừa chèn bản ghi vào cơ sở dữ liệu , bạn có thể muốn bắt buộc DOM cập nhật để bạn có thể tìm thấy các phần tử mới sử dụng thư viện như jQuery như . Trong trường hợp đó, hãy gọi Meteor.flush để cập nhật DOM ngay lập tức.

Tôi đoán mã của tôi đang chạy trong khi người dùng đang nhập, do đó DOM không được cập nhật. Tôi sẽ cố gắng sử dụng Meteor.flush để khắc phục. Bây giờ chuyện gì xảy ra với vấn đề thứ hai?

+0

bạn có thể đăng ứng dụng sao băng nhỏ nhất có thể sao chép vấn đề này không? – Milimetric

Trả lời

2

Lý do cho vấn đề đầu tiên là Meteor sử dụng để đóng băng mọi thay đổi đối với bộ nhớ cache cơ sở dữ liệu cục bộ của bạn trong khi bất kỳ phương thức nào đang bay. Meteor 0.5.1 cải thiện điều này để chỉ đóng băng các thay đổi đối với các tài liệu mà bạn đã sửa đổi cục bộ. Tôi nghi ngờ rằng Meteor 0.5.1 sửa lỗi này. Xem http://meteor.com/blog/2012/11/19/latency-compensation-improvements-coming-soon-in-meteor-051 để biết thêm thông tin.

Vấn đề thứ hai có thể được giải quyết bằng gói preserve-inputs được thêm vào trong Meteor 0.4.2, nhưng thật khó để chắc chắn nếu không có thêm chi tiết.

Tôi rất muốn biết liệu sự cố của bạn có còn tồn tại trong các phiên bản hiện tại của Meteor hay không!

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